2017-11-03 1 views
0

berechnet wird Ich benutze Scrapy, um Immobilien zu crawlen.
Ich habe Feldpreis und Größe (in m2), also kann ich price_per_m2 als Preis/Größe berechnen.
Wo Feld hinzufügen, das aus anderen Dateien in Scrapy

Meine Frage ist, wo soll ich das (in welcher Klasse) nach der besten Praxis in Scrapy tun?

Jetzt habe ich es in meinem scrapy.Spider, aber sollte ich es an einem anderen Ort haben (wie Pipeline) und wie (Codebeispiele bevorzugt)?

Antwort

1

Wenn Sie eine Berechnung (oder Nachbearbeitung im Allgemeinen) für alle Elemente gemeinsam haben, ist die Verwendung einer Pipeline eine Möglichkeit, dies zu tun. In Immobilien kann ich mir zum Beispiel vorstellen, Adressen zu geocodieren oder jedes Objekt in der Datenbank zu speichern. Der Hauptgrund für die Verwendung von Pipeline ist meiner Meinung nach, dass Sie diese zusätzliche Logik aus Spiders heraustrennen, so dass Sie einen einzigen Wartungsort haben, wenn Sie diese Logik ändern müssen. In den oben genannten Beispielen könnten Sie den Geocoding-Provider ändern oder anstelle einer Datenbank-Engine zu einer anderen wechseln. Das ist die wahre Stärke von Pipelines. Allerdings lässt sich der Preis pro Quadratmeter, der kaum zu ändern ist, problemlos aus dem Preis und der Größe in den Spidercode einrechnen. Auf der anderen Seite, wenn es mehr solcher einfachen Berechnungen gibt, könnten Sie Pipelines verwenden, um Zeit zu sparen und den gleichen Code in jeder Spinne zu wiederholen.

1

Während ich in einigen Punkten mit Tomas übereinstimmen kann, würde ich diese Berechnung nie in die Spinne selbst setzen.

Ich benutze Spinnen, um Daten von Seiten zu extrahieren. Für mich ist das der einzige Zweck einer Spinne. Ich benutze ItemLoader zum Reinigen von extrahierten Daten und grundlegende Manipulation (wie alles in die gleiche Basiseinheit konvertieren). Und schließlich verwende ich Pipelines für jede Datenmanipulation auf hohem Niveau, wie das Kombinieren von Feldern aus Elementen.

Stellen Sie sich vor Sie haben ein Dutzend Spinnen und Sie berechnen price_per_m2 in ihnen. Ihr Projekt ist gewachsen und Sie beginnen, Spinnen für ein anderes Land zu programmieren. Sie haben Spinnen, die Preise in GBP, EUR und USD erhalten. Wenn Sie nun price_per_m2 vergleichen möchten, müssen Sie 1) Einheiten in jeder Spinne vor Berechnungen umrechnen oder 2) Metadaten zu Elementen hinzufügen, um eine Nachbearbeitung durchzuführen. Beide Ansätze sind meiner Meinung nach belastend. Mein Ansatz: Spinnen extrahieren Daten, ItemLoader konvertiert jeden Preis in dieselbe Einheit, einige Pipeline berechnet price_per_m2 für jeden Artikel (alle in den gleichen Einheiten).

+0

Ich wählte Antwort von Tomas, nur weil er zuerst war, Entschuldigung dafür :-). Können Sie mir erklären, warum würden Sie jeden Preis in ItemLoader (https://doc.scrapy.org/en/latest/topics/loaders.html#input-and-output-processors) und nicht in Spyder in dieselbe Einheit konvertieren? Ich versuche die Logik hinter dem Scrapy Framework zu verstehen. – WebOrCode

+0

1) Idealerweise möchte ich im Artikel selbst Operationen wie Einheitenumrechnungen durchführen. Aber Scrapy Design folgt einem anderen Ansatz und ich kämpfe nicht dagegen. ItemLoader ist der Item, wo ich diese Operation machen kann, am nächsten. 2) Es ist mehr DRY: wenn ItemLoader verwendet wird, würde alles, was mit Einheitenumwandlungen zu tun hat, in einem einzigen Prozessor sein, während wenn ich es in Spiders mache, würde ich Code/Logik duplizieren. – Djunzu

Verwandte Themen