【问题标题】:Scrapy proxy ip does not work with https, returns 'ssl handshake failure'Scrapy 代理 ip 不适用于 https,返回 'ssl 握手失败'
【发布时间】:2016-03-28 19:42:38
【问题描述】:

Scrapy 使用我的代理 ip 处理 http 请求,但不适用于 https 请求。

我知道我的代理 IP 正在使用 http,因为我通过向 http://ipinfo.io/ip 发送请求来测试它:

2016-03-28 12:10:42 [scrapy] DEBUG: Crawled (200) <GET http://ipinfo.io/ip> (referer: http://www.google.com)
2016-03-28 12:10:42 [root] INFO:  *** TEST, WHAT IS MY IP: ***
107.183.7.XX

由于此错误消息,我知道它无法处理 https 请求:

2016-03-28 12:10:55 [scrapy] DEBUG: Gave up retrying <GET https://www.my-company-url.com> (failed 3 times): [<twisted.python.failure.Failure OpenSSL.SSL.Error: [('SSL routines', 'ssl23_read', 'ssl handshake failure')]>]

我的settings.py 包含:

DOWNLOADER_MIDDLEWARES = {
    'crystalball.middlewares.ProxyMiddleware': 100,
    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110
}

我的crystalball.middlewares.ProxyMiddleware 包含:

import base64

class ProxyMiddleware(object):

    def process_request(self, request, spider):
        request.meta['proxy'] = "https://107.183.X.XX:55555"
        proxy_user_pass = "hXXbp3:LitSwDXX99"
        encoded_user_pass = base64.encodestring(proxy_user_pass)
        request.headers['Proxy-Authorization'] = 'Basic ' + encoded_user_pass

对我接下来应该尝试什么有什么建议吗?

旁注:此 SO 帖子中的解决方案无效:Scrapy and proxies

【问题讨论】:

    标签: python scrapy twisted scrapy-spider pyopenssl


    【解决方案1】:

    罪魁祸首是 base64.encodestring(),它在请求的 Proxy-Authorization 标头的值中添加了一个不需要的新行 \n 字符。

    解决方案就是将strip() 关闭\n

    改变这一行:

    request.headers['Proxy-Authorization'] = 'Basic ' + encoded_user_pass
    

    到这里:

    request.headers['Proxy-Authorization'] = 'Basic ' + encoded_user_pass.strip()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-31
      • 2021-07-03
      • 2019-11-07
      • 1970-01-01
      • 1970-01-01
      • 2018-07-28
      • 1970-01-01
      相关资源
      最近更新 更多