2016-01-20 12 views
9

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.

+0

un problema molto interessante, penso che dovresti condividere più codice spider e forse alcuni middleware se li stai utilizzando. – eLRuLL

+0

@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

+0

Sto modificando il mio post per cercare di riflettere su quale fosse il problema – vrleboss

risposta

5

E se semplicemente ignori gli errori ??

 
def parse_player(self, response): 
    if response.status == 200: 
     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 
+0

E ... Una risposta molto semplice ottenere la taglia. Buona strategia e fortuna lì –