2016-04-06 12 views
0

Ich bin relativ neu zu scrapy. Ich stoße in Situationen, in denen einige der Seiten nicht richtig geladen werden. Ich möchte diese Aufgabe erneut zweimal wiederholen, um sicherzustellen, dass sie ordnungsgemäß funktioniert. Beachten Sie, dass ich keinen 404-Fehler erhalte, aber es beim Analysieren des Ergebnisses aufgrund eines fehlenden Elements fehlschlägt.Wie wiederhole ich scrapy Aufgaben bei Ausfall

Es passiert nur für ein paar Fälle von hundert und ich kann es nicht reproduzieren, wie es das nächste Mal passiert, wenn ich es versuche. (verifiziert durch Erfassen des gesamten Antwortkörpers)

was wäre ein guter Weg, damit umzugehen?

ich versuchte

def parse(self, response): 
    try: 
     #do something 
     yield result 
    except: 
     yield Request(response.url, callback=self.parse) 

zu tun, aber ich denke, diese werden gefiltert zu werden und als Duplikate von scrapy anerkannt. Was wäre der beste Weg, dieses Problem anzugehen?

+1

Scrapy Filterung doppelte Anforderungen zu vermeiden, Sie 'Ausbeute Request (response.url, Rückruf = self.parse, dont_filter = True)' –

+0

Dank viel verwenden können, hilft es. Gibt es trotzdem, ich kann die Anzahl der Iterationen begrenzen, um sicherzustellen, dass ich nicht für echte Fehler erneut versuchen. – pankaj

+1

es ist die Bedingung, die Sie für die Wiederholung bei Ausnahme festlegen. Möglicherweise möchten Sie die Ausnahmen eingrenzen, die Sie erneut versuchen möchten. Sie können auch eine Zählung in der 'Meta' der Anfrage behalten, wie ['RetryMiddleware' tut] (https://github.com/scrapy/scrapy/blob/ebef6d7c6dd8922210db8a4a44f48fe27ee0cd16/scrapy/downloadermiddlewares/retry.py#L62) –

Antwort

0

hier ist, wie ich endlich meine Lösung implementiert.

def parse(self, response): 
    meta = response.meta 
    retries = meta.get(MISSING_RATINGS_RETRY_COUNT, 0) 
    if retries < MAX_RETRIES: 
     throw_on_failure = True 
    else: 
     throw_on_failure = False 
    try: 
     #do something 
     #use throw_on_failure variable to thorw the exception based on missing data from the response. 
     yield result 
    except specificException: 
     meta[MISSING_RATINGS_RETRY_COUNT] = retries + 1 
     yield Request(response.url, callback=self.parse, meta=meta, dont_filter=True) 
Verwandte Themen