Ich habe ein Scrapy-Projekt, das mehrere Spinnen enthält. Kann ich auf irgendeine Weise definieren, welche Pipelines für welche Spinne verwendet werden sollen? Nicht alle von mir definierten Pipelines gelten für jede Spinne.
Vielen Dank
python
scrapy
web-crawler
CodeMonkeyB
quelle
quelle
Antworten:
Aufbauend auf der Lösung von Pablo Hoffman können Sie den folgenden Dekorator für die
process_item
Methode eines Pipeline-Objekts verwenden, damit daspipeline
Attribut Ihrer Spinne überprüft wird, ob es ausgeführt werden soll oder nicht. Beispielsweise:Damit dieser Dekorator ordnungsgemäß funktioniert, muss die Spinne über ein Pipeline-Attribut mit einem Container der Pipeline-Objekte verfügen, mit denen Sie das Element verarbeiten möchten. Beispiel:
Und dann in einer
pipelines.py
Datei:Alle Pipeline-Objekte sollten weiterhin in den Einstellungen in ITEM_PIPELINES definiert sein (in der richtigen Reihenfolge - wäre schön zu ändern, damit die Reihenfolge auch auf dem Spider angegeben werden kann).
quelle
scrapy crawl <spider name>
Befehl auf. Python erkennt die Namen, die ich in der Spider-Klasse festgelegt habe, nicht, damit Pipelines ausgeführt werden können. Ich werde Ihnen Links zu meiner spider.py und Pipeline.py geben damit Sie einen Blick darauf werfen können. Dankespider.py
rechts?if not hasattr(spider, 'pipeline') or self.__class__ in spider.pipeline:
Entfernen Sie einfach alle Pipelines aus den Haupteinstellungen und verwenden Sie diese innere Spinne.
Dadurch wird die Pipeline zum Benutzer pro Spinne definiert
quelle
Die anderen Lösungen hier gegeben sind gut, aber ich denke , sie langsam sein könnte, weil wir nicht wirklich sind nicht die Pipeline pro Spinne verwenden, anstatt prüfen wir , ob eine Pipeline zurückgegeben jedes Mal ein Element vorhanden ist (und in einigen Fällen könnte dies erreichen Millionen).
Eine gute Möglichkeit, eine Funktion pro Spinne vollständig zu deaktivieren (oder zu aktivieren), ist die Verwendung
custom_setting
undfrom_crawler
für alle Erweiterungen wie diese:pipelines.py
settings.py
spider1.py
Während Sie dies überprüfen, haben wir angegeben,
custom_settings
dass die in angegebenen Elemente überschrieben werdensettings.py
, und wir deaktivierenSOMEPIPELINE_ENABLED
diese Spinne.Wenn Sie diese Spinne ausführen, überprüfen Sie Folgendes:
Jetzt hat Scrapy die Pipeline vollständig deaktiviert und sich nicht um ihre Existenz für den gesamten Lauf gekümmert. Überprüfen Sie, ob dies auch für Scrapy
extensions
und funktioniertmiddlewares
.quelle
Ich kann mir mindestens vier Ansätze vorstellen:
scrapy settings
zwischen jedem Aufruf Ihrer Spinnedefault_settings['ITEM_PIPELINES']
für Ihre Befehlsklasse in der Pipeline-Liste, die Sie für diesen Befehl benötigen. Siehe Zeile 6 dieses Beispiels .process_item()
Überprüfen Sie in den Pipeline-Klassen selbst, gegen welche Spinne sie ausgeführt wird, und tun Sie nichts, wenn sie für diese Spinne ignoriert werden soll. Sehen Sie sich das Beispiel an, in dem Ressourcen pro Spinne verwendet werden , um den Einstieg zu erleichtern. (Dies scheint eine hässliche Lösung zu sein, da sie Spinnen und Gegenstands-Pipelines eng miteinander verbindet. Sie sollten diese wahrscheinlich nicht verwenden.)quelle
Sie können das
name
Attribut der Spinne in Ihrer Pipeline verwendenWenn Sie alle Pipelines auf diese Weise definieren, können Sie das erreichen, was Sie wollen.
quelle
Sie können die Einstellungen für Elementpipelines in der Spinne einfach wie folgt festlegen:
Ich kann dann eine Pipeline aufteilen (oder sogar mehrere Pipelines verwenden), indem ich dem Lader / zurückgegebenen Element einen Wert hinzufüge, der angibt, über welchen Teil der Spinne Elemente gesendet wurden. Auf diese Weise erhalte ich keine KeyError-Ausnahmen und weiß, welche Elemente verfügbar sein sollten.
quelle
Einfache aber dennoch nützliche Lösung.
Spinnencode
Pipeline-Code
Hoffe das spart etwas Zeit für jemanden!
quelle
Ich verwende zwei Pipelines, eine zum Herunterladen von Bildern (MyImagesPipeline) und eine zum Speichern von Daten in Mongodb (MongoPipeline).
Angenommen, wir haben viele Spinnen (Spider1, Spider2, ...........). In meinem Beispiel können Spider1 und Spider5 MyImagesPipeline nicht verwenden
settings.py
Und unten vollständiger Code der Pipeline
quelle
Wir können einige Bedingungen in der Pipeline als diese verwenden
quelle