2017-08-08 3 views
0

Ich habe einen funktionierenden Crawler in Scrapy + Splash. Es startet eine Spinne auf vielen Seiten. Jede Seite enthält eine Liste von Links. Für jede Seite lädt der Spider die Seite dann einige der verlinkten Seiten (nicht rekursiv). Alle Seiten werden im Dateisystem gespeichert. Das System funktioniert einwandfrei. Im Moment überarbeite ich es, um einige DB-Interaktionen hinzuzufügen. Ich verwende keine Items oder Item-Pipelines. Was sind die Vorteile ihrer Verwendung?Scrapy: Warum Pipelines verwenden?

Hinzufügen von Informationen: Der Zweck meines Crawlers ist das Herunterladen ganzer Seiten (in HTML, PNG oder konvertiert in TXT mit einer Bibliothek). Sobald die Spinne die response zu speichern hat, übergibt sie es an eine Bibliothek, die alle io ops (Dateisystem und DB) kapseln. Auf diese Weise ist es einfacher als die Verwendung von Gegenständen (mit Umrechnungstabellen) und Pipelines. Wo ist mein Zweifel? Ich weiß nicht, wie Scrapy intern gut genug funktioniert. Wie der Crawler implementiert ist, werden die io-Ops im Thread des Spiders ausgeführt. Jede Spinne braucht also länger, um sie auszuführen. Umgekehrt, wenn ich die io ops in die Pipeline verschiebe, kann vielleicht (?) Scrapy seine Jobs besser planen und sie getrennt vom Crawling-Job ausführen. Wird es einen wirklichen Leistungsunterschied geben?

+1

Überprüfen Sie [offizielle Dokumentation] (https://doc.scrapy.org/en/latest/topics/item-pipeline.html). – Granitosaurus

+0

Ich habe die offizielle Dokumentation noch nicht gelesen und sie beantwortet meine Frage nicht. Ich weiß, dass ich Item-Pipelines verwenden kann, ihr Nachteil ist: Sie benötigen einen bestimmten Code, ihre Oberseite ist ... was? – chairam

+0

Was ist falsch, wenn ich auf der DB in der Spinne schreibe, wenn es etwas gibt? – chairam

Antwort

1

Meiner Meinung nach verwendet die Verwendung von Pipelines nur das separation of concerns Prinzip. Ihre Spinne kann viele Dinge tun, aber ihre Kernfunktion besteht darin, Informationen aus Webseiten zu extrahieren. Der Rest kann (und möglicherweise sollte) in eine Pipeline oder eine Erweiterung umgewandelt werden.

Es kann nicht so ein Problem sein, wenn Sie eine Spinne für eine Website haben. Aber stellen Sie sich vor, Sie haben ein Scrapy-Projekt mit hunderten von Spidern für semantisch ähnliche Websites und möchten für jedes Element die gleiche Logik anwenden - einen Seitenschnappschuss machen, nach Duplikaten suchen, in der Datenbank speichern usw. Und stellen Sie sich jetzt die Wartungshölle vor Sie hatten die ganze Logik in jeder der Spinnen und mussten diese Logik ändern.

+0

Ich habe die Frage bearbeitet – chairam