Ip прокси-сервера Scrapy не работает с https, возвращает сообщение "Ошибка рукопожатия ssl"
Scrapy работает с моим прокси ip для запроса http, но не для запроса http.
Я знаю, что мой прокси-сервер 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 и прокси.
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()