2016-03-28 10 views
1

Scrapy работает с моим прокси-сервером для http-запроса, но не для http s.Scrapy proxy ip не работает с https, возвращает «ssl handshake failure»

Я знаю, что мой прокси-сервер 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.

ответ

3

Претендент base64.encodestring(), который добавляет ненужную новую строку \n в значение заголовка прокси-авторизации запроса.

Решение было просто strip() с \n.

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

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

Для этого:

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