Ich sehe oft Crawler in meiner Arbeit, aber dieses Mal werde ich Django + Sellerie vorerst verwenden, wenn ich einen neuen Crawler erstelle, also werde ich versuchen, ein Beispiel zu schreiben und zu schreiben, was ich dachte, während ich ein Beispiel schreibe.
Obwohl es sich um einen Crawler handelt, sprechen wir häufig in einem Zustand, in dem die Definition je nach Person leicht unterschiedlich ist. Daher ist das Ziel dieser Zeit vorerst
Ich werde vor Ort sprechen.
y-matsuwitter/django_sample_crawler
Dies ist die Struktur zum Schreiben des Beispiels.
Ich habe die erstellt, die das Folgende mit implementiert.
Wenn der Crawler längere Zeit in Betrieb ist, kann nur ein Teil der Verarbeitung des Crawlers aufgebläht und langsam werden. Zum Beispiel ist die CPU im Abschnitt zum Extrahieren von Inhalten fast erschöpft. Zu diesem Zeitpunkt ist es notwendig, Maßnahmen zu ergreifen, beispielsweise nur diesen Prozess zu trennen, aber ich denke, dass es notwendig ist, von Anfang an auf das MessageQueue-System zuzugreifen, um einen solchen verteilten Betrieb zu vereinfachen. Dieses Mal wird Sellerie verwendet, um diese Schicht zu verarbeiten. Als interner Prozess des Erwerbs von Github-Trends dieses Mal
Es wird in der Reihenfolge ausgeführt. Jeder Prozess wird als separate Sellerie-Aufgabe behandelt. Wenn Sie die Worker-Einstellungen anpassen, können Sie jedem Prozess einen anderen Server-Cluster zuweisen. Übrigens ist es diesmal eine große Unterteilung für den entsprechenden Crawler, aber wenn Sie jeden Prozess separat als Aufgabe angeben, ist es einfacher, Wiederholungsversuche durchzuführen, wenn eine bestimmte Aufgabe fehlschlägt. Wenn Sie beispielsweise die Trendseite herunterladen, die Regel jedoch in der Analysephase nicht ausreicht und sie beendet wird, können Sie sie wiederherstellen, indem Sie nur die Zielaufgabe korrigieren und nur diese Aufgabe erneut ausführen. Die Aufgabe ist auf dieser Ebene blockiert. Selbst wenn Sie dies tun, können Sie dieser Ebene problemlos Ressourcen hinzufügen.
Sellerie hat einen Mechanismus namens periodische Aufgabe, und Sie können die Aufgabe, die periodisch ausgeführt werden soll, auch als periodische Aufgabe angeben. Dieses Mal wird der Teil, der den Crawler jeder Regel betreibt, der am grundlegendsten ist, durch den Zeitplan festgelegt.
from celery.schedules import crontab
CELERYBEAT_SCHEDULE = {
'run_all_crawler_schedule': {
'task': 'crawler.tasks.run_all_crawler',
'schedule': crontab(minute='*/2'),
},
}
Übrigens wird die Tatsache, dass es alle zwei Minuten ausgeführt wird, nur im Debug entsprechend geschrieben. Wenn Sie es also wirklich bedienen möchten, ist etwas mehr Platz vorhanden.
rate_limit Wenn Sie eine Site im Detail kratzen, kann der HTML-Erfassungsprozess die Zielsite belasten. Sellerie hat einen Mechanismus namens rate_limit, mit dem Sie angeben können, wie oft jede Aufgabe ausgeführt werden soll.
@celery_app.task(rate_limit="60/m")
def fetch_trending(crawler_id):
pass
Oben können Sie den Betrieb so einschränken, dass er nicht mehr als 60 Mal pro Minute ausgeführt wird.
Sellerie allein reicht aus, um einen normalen Crawler zu erstellen. Im Langzeitbetrieb wird das Hinzufügen von Regeln und Websites jedoch stetig zunehmen. Beim Hinzufügen solcher Regeln zur Datenbank kann die Situation auf dem Verwaltungsbildschirm auf der Webseite angezeigt werden. Die Kombination mit Django ist praktisch, wenn Sie beispielsweise die Überprüfung in Betracht ziehen. Diesmal ist es so einfach, dass die Crawler-Regeln den Trend-Erfassungsregeln ähnlich sind, aber Sie können diese Informationen in django admin festlegen.
Wenn Sie später Regeln hinzufügen, besteht das vielleicht größte Problem darin, Regeln zu kratzen, die meiner Meinung nach durch Speichern des xpath- oder css-Selektors in der Regel behoben werden können. Möglicherweise möchten Sie auf den Mechanismus von Scrapy verweisen.
Ich habe das Gefühl, dass ich im Internet nicht viel Wissen habe, um einen relativ großen Crawler zu betreiben, daher möchte ich eine Lernsitzung haben, um das Wissen in diesem Bereich zu teilen.
Recommended Posts