2016-07-02 2 views
0

Я могу очистить страницы без использования прокси. Однако, когда я добавляю прокси, scrapy либо дает Error downloading: Connection was refused by other side: 61: Connection refused, либо [<twisted.python.failure.Failure twisted.internet.error.ConnectionLost: Connection to the other side was lost in a non-clean fashion.>], либо вызывает исключение тайм-аута. Прокси-серверы находятся в типе http.Scrapy: ошибка загрузки с прокси

Вот что я добавляю к setting.py

PROXIES = [{'ip_port': '213.136.90.232:8080', 'user_pass': ''},] 

DOWNLOADER_MIDDLEWARES = { 
    'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware': 110, 
    'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware' : 100, 
    'judgeinfo.middleware.RotateUserAgentMiddleware' :1, 
    'judgeinfo.middleware.ProxyMiddleware' :100, 

} 

А вот мой middleware.py

import random 
import base64 
from settings import PROXIES 

class ProxyMiddleware(object): 
def process_request(self, request, spider): 
    proxy = random.choice(PROXIES) 
    if proxy['user_pass'] is not None: 
     request.meta['proxy'] = "http://%s" % proxy['ip_port'] 
     encoded_user_pass = base64.encodestring(proxy['user_pass']) 
     request.headers['Proxy-Authorization'] = 'Basic ' + encoded_user_pass 
     print "**************ProxyMiddleware have pass************" + proxy['ip_port'] 
    else: 
     print "**************ProxyMiddleware no pass************" + proxy['ip_port'] 
     request.meta['proxy'] = "http://%s" % proxy['ip_port'] 

Я проверил прокси с помощью локон и вернулся правильные ответы.

curl -L 'http://IP:port' -v "http://www.stackoverflow.com" 

Я также добавил случайно выбранные USER_AGENT и установите DOWNLOAD_DELAY = 3

+0

SCRAPY обычно использует 'b64encode' insteaf из' encodestring', как 'encodestring' добавляет символ новой строки в конце закодированной строки, попробуйте зачистки эту строку или с помощью' b64encode ("mystr ing "). strip()' – eLRuLL

+0

Это решает мою проблему! Благодаря! @eLRuLL –

ответ

0

Только для полноты ... (я ненавижу, чтобы найти ответы в комментариях)

middleware.py должен быть изменен чтобы:

import random 
import base64 
from settings import PROXIES 

class ProxyMiddleware(object): 
    def process_request(self, request, spider): 
     proxy = random.choice(PROXIES) 
     if proxy['user_pass'] is not None: 
      request.meta['proxy'] = "http://%s" % proxy['ip_port'] 
      encoded_user_pass = base64.b64encode(proxy['user_pass']).strip() 
     request.headers['Proxy-Authorization'] = 'Basic ' + encoded_user_pass 
     print "**************ProxyMiddleware have pass************" + proxy['ip_port'] 
    else: 
     print "**************ProxyMiddleware no pass************" + proxy['ip_port'] 
     request.meta['proxy'] = "http://%s" % proxy['ip_port'] 
+0

Спасибо! Я это проверю! –

Смежные вопросы