Nota dell'autore: Si potrebbe pensare che questo post sia privo di contesto o informazioni, solo perché non so da dove iniziare. Modificherò volentieri con ulteriori informazioni su richiesta.Errore di download di scrapy e errore di remove_request
Esecuzione Scrapy vedo il seguente errore tra tutti il link Sto raschiando:
ERROR: Error downloading <GET http://www.fifa.com/fifa-tournaments/players-coaches/people=44630/index.html>
Traceback (most recent call last):
File "/Library/Python/2.7/site-packages/twisted/internet/defer.py", line 588, in _runCallbacks
current.result = callback(current.result, *args, **kw)
File "/Library/Python/2.7/site-packages/scrapy/core/downloader/__init__.py", line 75, in _deactivate
self.active.remove(request)
KeyError: <GET http://www.fifa.com/fifa-tournaments/players-coaches/people=44630/index.html>
2016-01-19 15:57:20 [scrapy] INFO: Error while removing request from slot
Traceback (most recent call last):
File "/Library/Python/2.7/site-packages/twisted/internet/defer.py", line 588, in _runCallbacks
current.result = callback(current.result, *args, **kw)
File "/Library/Python/2.7/site-packages/scrapy/core/engine.py", line 140, in <lambda>
d.addBoth(lambda _: slot.remove_request(request))
File "/Library/Python/2.7/site-packages/scrapy/core/engine.py", line 38, in remove_request
self.inprogress.remove(request)
KeyError: <GET http://www.fifa.com/fifa-tournaments/players-coaches/people=44630/index.html>
Quando eseguo sconnesso semplicemente su quel singolo URL utilizzando:
scrappy shell http://www.fifa.com/fifa-tournaments/players-coaches/people=44630/index.html
Nessun errore sono si verificano. Sto eliminando migliaia di link simili senza problemi, ma vedo questo problema sui collegamenti ~ 10. Sto usando il timeout di download predefinito di 180
secondi da scrappy. Non vedo nulla di sbagliato in questi collegamenti anche nel mio browser web.
L'analisi viene avviata dalla richiesta:
request = Request(url_nrd,meta = {'item' : item},callback=self.parse_player,dont_filter=True)
che viene gestito nelle funzioni:
def parse_player(self, response):
if response.status == 404:
#doing stuff here
yield item
else:
#doing stuff there
request = Request(url_new,meta = {'item' : item},callback=self.parse_more,dont_filter=True)
yield request
def parse_more(self, response):
#parsing more stuff here
return item
anche: Non ho cambiato le impostazioni di default per i tentativi di scaricare a Scrappy (ma io non vedo alcun tentativo anche nei miei file di registro).
Note aggiuntive: Dopo il mio raschiatura completato e dato dont_filter=True
posso vedere che i collegamenti che non sono riusciti a scaricare con l'errore precedente ad un certo punto, non hanno mancato quando viene chiamato nelle richieste precedenti e successive.
risposta possibile: vedo che sto ottenendo un KeyError
su uno dei ragni e che de-assegnazione di quel ragno fallito (remove_request
). È possibile che sia perché sto impostando dont_filter=True
e facendo diverse richieste sullo stesso URL e che la chiave dello spider sembra essere quell'URL? Che lo spider è stato disallocato da una precedente richiesta simultanea sullo stesso URL?
In tal caso, come disporre di una chiave univoca per richiesta e non indicizzata nell'URL?
EDIT
Penso che il mio codice nella parse_player
era il problema, non lo so per certo perché ho modificato il mio codice da quando, ma mi ricordo di aver visto una brutta rientro sulla yield request
.
def parse_player(self, response):
if response.status == 404:
#doing stuff here
yield item
else:
paths = sel.xpath('some path extractor here')
for path in paths:
if (some_condition):
#doing stuff there
request = Request(url_new,meta = {'item' : item},callback=self.parse_more,dont_filter=True)
# Bad indent of yield request here!
yield request
Fatemi sapere se pensate che potrebbe aver causato il problema.
un problema molto interessante, penso che dovresti condividere più codice spider e forse alcuni middleware se li stai utilizzando. – eLRuLL
@eLRuLL Purtroppo ho cambiato completamente il mio codice scrapy da quel post.Filtro tutta la mia richiesta ora che è molto meglio e non vedo più quel problema (quindi penso che in qualche modo 'dont_filter' sia il colpevole qui. Durante la modifica del mio codice, ricordo di aver visto un potenziale problema che avrebbe potuto causare il problema : - o creando una richiesta in 'parse_player' e non cedendo mai. - o stavo cedendo una richiesta che non ho mai creato in primo luogo Purtroppo non posso dirti molto di più come la mia struttura del codice è abbastanza diversa Ora, sentitevi liberi di chiudere la domanda tra – vrleboss
Sto modificando il mio post per cercare di riflettere su quale fosse il problema – vrleboss