2014-07-04 1 views
5

Während meines Crawlings sind einige Seiten aufgrund einer unerwarteten Umleitung fehlgeschlagen und es wurde keine Antwort zurückgegeben. Wie kann ich diese Art von Fehler abfangen und eine Anfrage mit der ursprünglichen URL neu planen, nicht mit der umgeleiteten URL?Scrapy: Wie kann ich einen Download-Fehler erkennen und erneut herunterladen?

Bevor ich hier frage, mache ich eine Menge Suche mit Google. Es gibt zwei Möglichkeiten, dieses Problem zu beheben. Eine davon ist die Ausnahme in einer Download-Middleware, die andere besteht darin, die Download-Exception in einem Fehler in Spider's Request zu verarbeiten. Für diese beiden Fragen habe ich einige Fragen.

  • Für Methode 1, ich weiß nicht, wie die ursprüngliche URL zu Process_Exception-Funktion übergeben. Unten ist der Beispielcode, den ich ausprobiert habe.
class ProxyMiddleware(object): 

    def process_request(self, request, spider): 
     request.meta['proxy'] = "http://192.168.10.10" 
     log.msg('>>>> Proxy %s'%(request.meta['proxy'] if request.meta['proxy'] else ""), level=log.DEBUG) 
    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 
  • Bei Methode 2, ich weiß nicht, wie externe Parameter zu übergeben Funktion in der Spinne errback. Ich weiß nicht, wie ich die ursprüngliche URL von dieser Fehlerrückgabe-Funktion abrufen kann, um eine Anfrage neu zu planen.

    Unten finden Sie das Beispiel, das ich mit der Methode versucht 2:

class ProxytestSpider(Spider): 

    name = "proxytest" 
    allowed_domains = ["baidu.com"] 
    start_urls = (
     'http://www.baidu.com/', 
     ) 
    def make_requests_from_url(self, url): 
     starturl = url 
     request = Request(url, dont_filter=True,callback = self.parse, errback = self.download_errback) 
     print "make requests" 
     return request 
    def parse(self, response): 
     pass 
     print "in parse function"   
    def download_errback(self, e): 
     print type(e), repr(e) 
     print repr(e.value) 
     print "in downloaderror_callback" 

Jeder Vorschlag für diese erneute Suche Frage sehr geschätzt wird. Danke im Voraus.

Grüße

Bing

+0

@ dabling1205, zeigen Sie uns, was Sie –

+0

Die Post sieht ein Wurf unordentlich versucht haben, ich bin neu hier und nicht mit dem Format bearbeiten, :) – dabing1205

Antwort

1

Sie einen Lambda als errback passieren könnte:

request = Request(url, dont_filter=True,callback = self.parse, errback = lambda x: self.download_errback(x, url)) 

auf diese Weise haben Sie Zugriff auf die URL in der errback Funktion haben werden:

def download_errback(self, e, url): 
    print url 
+0

Danke für deine Antwort, das funktioniert gut. Danke noch einmal. – dabing1205

0

Sie können die RETRY_HTTP_CODES in settings.py

überschreiben

Dies ist die Einstellungen, die ich für die Proxy-Fehler verwenden:

RETRY_HTTP_CODES = [500, 502, 503, 504, 400, 403, 404, 408] 
+1

Kumpels, Danke für Ihre Antwort. Ihre Kommentare funktionieren gut in dem Fall, wenn der Download Antwort mit einem Status zurückgegeben hat :), nicht für den Download-Fehler passiert. – dabing1205

+0

danke für das Kommentieren @ dabing1205. Würde es Ihnen etwas ausmachen, den Fall zu teilen, in dem Sie auf einen Fehler oder den Typ der Ausnahme stoßen? –

Verwandte Themen