2016-09-20 7 views
0

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?

Antwort

2

sind hier zwei Ansätze:

  1. hinzufügen Dummy-Feld zu dem Element zu speichern, was Sie in der Spinne Code wollen. Und später holen Sie den Wert (und das Feld herauskommen) in der Gegenstandspipeline.

  2. Verwenden Sie anstelle einer Artikelpipeline spider middleware. In seiner process_spider_output Methode können Sie sowohl auf die Antwort als auch auf die Spider-Ausgabe zugreifen.

Verwandte Themen