Ich weiß, dass, wenn die Pipelines aufgerufen werden, bedeutet es, dass die Anfrage gestoppt wurde, sollten wir in der Regel eine Validierung, persist Job basierend auf dem extrahierten Element, es scheint, gibt es keinen Sinn Anfrage in der Pipeline erhalten.Wie Request-Objekt in scrapy Pipeline bekommen
Allerdings habe ich festgestellt, dass es in bestimmten Situationen nützlich sein kann, in meiner Anwendung verwende ich zwei Pipelines: FilesPipeline
und MysqlStorePipeline
.
Wenn ein Element extrahiert wird, versucht die FilesPipeline
Anforderung zu senden, um das Abbild des Elements zu erhalten, und speichert sie nach Abschluss in der Datenbank.
Allerdings verwende ich eine Download-Middleware RandomProxy
zur gleichen Zeit, die einen Proxy-Datensatz zufällig aus der Datenbank erhalten, und legen Sie es auf die Anfrage Meta. Aber der Proxy wird nicht gewährt, kann die ganze Zeit verwendet werden.
So kann folgendes passieren:
Wenn das Element abrufen, ein Proxy-http://proxy1
verwendet wird, aber es kann nicht verwendet werden, dank der Wiederholungsmiddleware wird scrapy erneut versuchen, und ein anderer Proxy http://proxy2
abgerufen aus db, wenn es verwendet werden kann, wird ein Element generiert, dann wird FilesPipeline
versucht, das Bild für das Element zu downloaden, indem eine Bildanforderung gesendet wird, die mit einem Proxy gefüllt wird sagen, es ist http://proxy3
, sobald der proxy3 nicht verwendet werden kann, scrapy wird es auch versuchen. Aber es gibt Chancen, während des gesamten Wiederholungsversuchs schlechte Proxies zu erhalten. Dann wird das Objekt gelöscht, weil kein gebundenes Bild abgerufen wird, das NICHT leer sein darf.
Außerdem enthält die Image-Anfrage keinen Referer, der irgendwann vom Server geblockt werden kann.
So frage ich mich, ob die Ursprungsanforderung zum Extrahieren eines Elements über die Pipeline zugegriffen werden kann.
Ist dies möglich oder ein anderer Vorschlag?