Attualmente sto lavorando a un progetto di raschiamento che è molto importante per garantire che OGNI richiesta sia stata gestita correttamente, ovvero per registrare un errore o per salvare un risultato positivo. Ho già implementato lo spider di base e ora posso elaborare il 99% delle richieste con successo, ma potrei ottenere errori come captcha, 50x, 30x, o anche campi non sufficienti nel risultato (quindi cercherò un altro sito web per trova i campi mancanti).come elaborare tutti i tipi di eccezione in un progetto scrapy, in errback e callback?
In un primo momento, ho pensato che fosse più "logico" sollevare eccezioni nel richiamo dell'analisi e elaborarle tutte in errore, questo potrebbe rendere il codice più leggibile. Ma ho cercato solo di scoprire che l'errback può solo intrappolare gli errori nel modulo downloader, come gli stati di risposta non-200. Se sollevo un ParseError auto-implementato nel callback, lo spider lo solleva e si ferma.
Anche se dovrò elaborare la richiesta di parsing direttamente nel callback, non so come riprovare immediatamente la richiesta nel callback in modo pulito. Sai, potrei dover includere un proxy diverso per inviare un'altra richiesta o modificare l'intestazione di una richiesta.
Ammetto che sono relativamente nuovo alla scrapy ma ho provato avanti e indietro per giorni e ancora non riesco a farlo funzionare ... Ho controllato ogni singola domanda su SO e nessuno corrisponde, grazie in anticipo per Aiuto.
UPDATE: Mi rendo conto che questo potrebbe essere una questione molto complessa e così cerco di illustrare lo scenario nel seguente pseudo codice, speriamo che questo aiuta:
from scraper.myexceptions import *
def parseRound1(self, response):
.... some parsing routines ...
if something wrong happened:
# this causes the spider raises a SpiderException and stops
raise CaptchaError
...
if no enough fields scraped:
raise ParseError(task, "no enough fields")
else:
return items
def parseRound2(self, response):
...some other parsing routines...
def errHandler(self, failure):
# how to trap all the exceptions?
r = failure.trap()
# cannot trap ParseError here
if r == CaptchaError:
# how to enqueue the original request here?
retry
elif r == ParseError:
if raised from parseRound1:
new request for Round2
else:
some other retry mechanism
elif r == HTTPError:
ignore or retry
grazie per aver chiarito le responsabilità di 'callback' e' err back'! Questo mi ha lasciato perplesso per molto tempo .. immagino che avrei dovuto capirlo scrivendo qualche spider di prova in precedenza ... –