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.
ein sehr interessantes Problem, ich denke, Sie sollten mehr Spider-Code und vielleicht einige Middlewares teilen, wenn Sie sie verwenden. – eLRuLL
@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
Ich bearbeite meinen Beitrag, um zu versuchen, das Problem widerzuspiegeln – vrleboss