2013-12-12 7 views
7

Ich habe einige Proxies verwendet, um einige Website zu kriechen. Hier ist ich in der settings.py tatPython Scrapy nicht wiederholt nicht Timeout Verbindung

# 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, 
       } 

Und ich habe auch eine Proxy-Download-Middleware, die folgenden Methoden:

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 

Da der Proxy manchmal nicht sehr stabil ist, process_exception oft aufgefordert, ein Viele Anfragen fehlgeschlagen. Das Problem hierbei ist, dass die fehlgeschlagene Anforderung nie wieder versucht worden.

Wie die Vorher zeigt, habe ich die Einstellungen RETRY_TIMES und RETRY_HTTP_CODES festgelegt, und ich habe auch die Anforderung für einen Wiederholungsversuch in der process_exception-Methode der Proxy-Middleware zurückgegeben.

Warum scrapy nie wiederholt für das Scheitern Anfrage erneut, oder wie kann ich sicherstellen, dass die Anforderung mindestens RETRY_TIMES versucht wird, ich in der settings.py festgelegt haben?

Antwort

5

Danke für die Hilfe von @nyov von Scrapy IRC-Kanal.

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

Hier wird zuerst Retry-Middleware ausführen, so wird es wiederholen sie die Anforderung, bevor es an die Proxy-Middleware macht. In meiner Situation muss scrapy die Proxys, die Website kriechen, oder es wird endlos Timeout.

So habe ich die Priorität zwischen diesen beiden Download mittleren Waren Reverse:

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

0

es scheint, dass Ihre Proxy-Download-Middleware ->process_response nicht an den Spielregeln und somit das Brechen der Middle Kette

process_response() sollte entweder ein Response-Objekt zurück, zurück ein Request-Objekt oder eine erhöhen Ausnahme IgnoreRequest.

Wenn eine Antwort zurückgegeben wird (es kann sich um die gleiche oder eine neue Antwort handeln), wird diese Antwort weiterhin mit der process_response() der nächsten Middleware in der Kette verarbeitet.

...

+0

Danke für die Antwort. Ich habe es versucht, aber nie erfolgreich. – David