IP-адрес прокси-сервера Scrapy не работает с https, возвращает «сбой рукопожатия ssl»

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 и прокси.


person b_dev    schedule 28.03.2016    source источник


Ответы (1)


Виновником является base64.encodestring(), который добавляет нежелательный символ новой строки \n в значение заголовка Proxy-Authorization запроса.

Решение состояло в том, чтобы просто strip() отказаться от \n.

Измените эту строку:

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

К этому:

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