2013-12-12 29 views
7

Użyłem niektórych serwerów proxy do indeksowania niektórych witryn. Oto zrobiłem w settings.py:Python Scrapy nie ponawia połączenia z limitem czasu

# Retry many times since proxies often fail 
RETRY_TIMES = 10 
# Retry on most error codes since proxies fail for different reasons 
RETRY_HTTP_CODES = [500, 503, 504, 400, 403, 404, 408] 

DOWNLOAD_DELAY = 3 # 5,000 ms of delay 

DOWNLOADER_MIDDLEWARES = { 
        'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware' : None, 
        'myspider.comm.rotate_useragent.RotateUserAgentMiddleware' : 100, 

        'scrapy.contrib.downloadermiddleware.retry.RetryMiddleware': 200, 
        'myspider.comm.random_proxy.RandomProxyMiddleware': 300, 

        'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware': 400, 
       } 

I mam również pobierania proxy pośredniczące, które mają następujące metody:

def process_request(self, request, spider): 
    log('Requesting url %s with proxy %s...' % (request.url, proxy)) 

def process_response(self, request, response, spider): 
    log('Response received from request url %s with proxy %s' % (request.url, proxy if proxy else 'nil')) 

def process_exception(self, request, exception, spider): 
    log_msg('Failed to request url %s with proxy %s with exception %s' % (request.url, proxy if proxy else 'nil', str(exception))) 
    #retry again. 
    return request 

Ponieważ proxy nie jest bardzo stabilny czasami process_exception często skłania wiele komunikatów o błędach zgłoszeń. Problem polega na tym, że nieudana próba nigdy nie była próbowana ponownie.

Tak jak poprzednio, ustawiłem ustawienia RETRY_TIMES i RETRY_HTTP_CODES, a także zwróciłem prośbę o ponowną próbę w metodzie process_exception w pośredniej wersji serwera proxy.

Dlaczego scrapy nigdy nie ponawiają próby ponownego zgłoszenia żądania, lub jak mogę się upewnić, że żądanie zostało sprawdzone przynajmniej RETRY_TIMES ustawiłem w pliku settings.py?

Odpowiedz

5

Dzięki za pomoc @nyov z Scrapy IRC Channel.

'scrapy.contrib.downloadermiddleware.retry.RetryMiddleware': 200,
'myspider.comm.random_proxy.RandomProxyMiddleware': 300,

Tutaj Ponów middleware dostaje uruchomić pierwszy, więc to będzie ponów żądanie, zanim przejdzie do pośrednika Proxy. W mojej sytuacji, scrapy potrzebuje serwerów proxy do przeszukiwania strony internetowej, lub będzie to bezterminowa przerwa.

więc już odwrócić pierwszeństwo pomiędzy tymi dwoma pobierania średnich wyrobów:

'scrapy.contrib.downloadermiddleware.retry.RetryMiddleware: 300,
'myspider.comm.random_proxy.RandomProxyMiddleware': 200,

0

wydaje się, że serwer proxy pobieranie middleware ->process_response nie jest odtwarzany przez przepisy, a tym samym zerwania łańcucha middleware

process_response() należy albo: zwraca obiekt Response, zwrócić przedmiot wniosek lub podnieść Wyjątek IgnoreRequest.

Jeśli zwróci odpowiedź (może to być ta sama dana odpowiedź lub zupełnie nowa), ta odpowiedź będzie nadal przetwarzana za pomocą funkcji process_response() następnego oprogramowania pośredniego w łańcuchu.

...

+0

Dzięki za odpowiedź. Próbowałem, ale nigdy nie udało mi się. – David