2016-01-20 4 views
9

Hinweis des Autors: Sie könnten denken, dass dieser Beitrag fehlt Kontext oder Informationen, das ist nur, weil ich nicht weiß, wo ich anfangen soll. Ich werde gerne mit zusätzlichen Informationen auf Ihre Anfrage bearbeiten.Scrapy Download Fehler und remove_request Fehler


Lauf scrapy Ich sehe den folgenden Fehler unter allen Link Ich bin Schaben:

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> 

Als ich Scrappy laufen einfach auf diese einzelne URL:

scrappy shell http://www.fifa.com/fifa-tournaments/players-coaches/people=44630/index.html 

keine Fehler vorkommend. Ich verschrotte Tausende von ähnlichen Links ohne Probleme, aber ich sehe dieses Problem auf ~ 10 Links. Ich benutze das Standard-180 Sekunden-Download-Timeout von Scrappy. Ich sehe nichts falsches mit diesen Links in meinem Webbrowser auch.

Das Parsen durch die Anfrage initiiert:

request = Request(url_nrd,meta = {'item' : item},callback=self.parse_player,dont_filter=True) 

, die in den Funktionen gehandhabt wird:

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 

auch: Ich Vorgaben nicht Einstellungen zum Download Wiederholungen in Scrappy ändern (aber ich sehe auch keine Wiederholungen in meinen Log-Dateien).

Zusätzliche Hinweise: Nach meinem Schaben abgeschlossen und seit dont_filter=True kann ich sehen, dass Links, die mit dem vorherigen Fehler irgendwann zum Download fehlgeschlagen ist, versäumen nicht, wenn in der vorangegangenen und nachfolgenden Anforderungen genannt.

Mögliche Antwort: Ich sehe, dass ich ein KeyError auf eine der Spinnen bin immer und dass de-Zuteilung dieser Spinne ist fehlgeschlagen (remove_request). Ist es möglich, dass es ist, weil ich dont_filter=True setze und mehrere Anfragen für dieselbe URL mache und dass der Schlüssel der Spinne diese URL zu sein scheint? Dass die Spinne durch eine vorherige, gleichzeitige Anfrage für die gleiche URL freigegeben wurde?

In diesem Fall, wie ein eindeutiger Schlüssel pro Anfrage und nicht indiziert auf der URL?


EDIT

denke ich mein Code in parse_player das Problem ist, ich weiß es nicht genau, weil ich seit meinem Code bearbeitet, aber ich erinnere mich an yield request einen schlechten Gedankenstrich zu sehen.

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 

Lassen Sie mich wissen, wenn Sie denken, dass das das Problem verursacht haben könnte.

+0

ein sehr interessantes Problem, ich denke, Sie sollten mehr Spider-Code und vielleicht einige Middlewares teilen, wenn Sie sie verwenden. – eLRuLL

+0

@eLRuLL Leider habe ich seit diesem Post meinen Scrapy Code komplett geändert.Ich filtere jetzt alle meine Anfrage, was viel besser ist und ich sehe dieses Problem nicht mehr (daher denke ich irgendwie, dass 'dont_filter' hier der Übeltäter ist. Während ich meinen Code bearbeite, erinnere ich mich an ein potentielles Problem, das das Problem verursacht haben könnte : - entweder Erstellen einer Anfrage in 'parse_player' und niemals Nachgeben - oder ich gab eine Anfrage, die ich nie an erster Stelle erstellt habe Leider kann ich Ihnen nicht viel mehr sagen, da meine Code-Struktur ganz anders ist Fühlen Sie sich frei, diese Frage zu schließen btw. – vrleboss

+0

Ich bearbeite meinen Beitrag, um zu versuchen, das Problem widerzuspiegeln – vrleboss

Antwort

5

Und wenn Sie einfach die Fehler ignorieren ??

 
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

Und ... Eine sehr einfache Antwort bekommen das Kopfgeld.Gute Strategie und Glück dort –