[PYTHON] Kein Grund zum Nachdenken beim Schreiben eines Crawlers mit Django und Celery

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.

Grundlegende Verarbeitungsstufe des Crawlers

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.

Konfiguration dieses Beispiels

y-matsuwitter/django_sample_crawler

Dies ist die Struktur zum Schreiben des Beispiels.

Ich habe die erstellt, die das Folgende mit implementiert.

Verteilte Ausführung jedes Prozesses durch Sellerie

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

スクリーンショット 2015-12-05 22.01.44.png

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.

Alternative zu Cron durch regelmäßige Aufgabe

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.

Vorteile der Kombination mit Django

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.

Schließlich

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

Kein Grund zum Nachdenken beim Schreiben eines Crawlers mit Django und Celery
So entwickeln Sie eine Cart-App mit Django
Wenn ich eine Django-App auf Apache2 bereitstelle und keine statischen Dateien mehr liest
[Django] Verwalten Sie Einstellungen wie das Schreiben in settings.py mit einem Modell
Ich möchte einen Blog-Editor mit dem Administrator von Django erstellen
Versuchen Sie, ein Unterfenster mit PyQt5 und Python zu öffnen
Erstellen Sie eine Homepage mit Django
So legen Sie eine Verknüpfung fest, um in IBus zwischen voller und halber Breite zu wechseln
Konvertieren Sie in eine Zeichenfolge, während Sie die Standardausgabe mit dem Python-Unterprozess ausgeben
Wiederholen Sie mit While. Skript zum Twittern oder Suchen vom Terminal aus
Erstellen Sie eine temporäre Datei mit Django als Zip und geben Sie sie zurück
So erstellen Sie eine Überwachungskamera (Überwachungskamera) mit Opencv und Python
Rails-Benutzer versuchen, mit Django eine einfache Blog-Engine zu erstellen
Ich habe versucht, das Entwicklungsstartverfahren von Django kurz zusammenzufassen
Ich habe versucht, mit Selenium und Python einen regelmäßigen Ausführungsprozess durchzuführen
Erstellen Sie mit Python + Django + AWS eine Scraping-App und wechseln Sie Jobs
Ich habe versucht, Bulls and Cows mit einem Shell-Programm zu erstellen
Startete eine Webanwendung auf AWS mit Django und wechselte Jobs
Ich habe Jinja2 beim Lesen des Dokuments verglichen, um es mit Django zu verwenden
Erstellen Sie eine REST-API, um dynamodb mit dem Django REST Framework zu betreiben
[DynamoDB] [Docker] Erstellen Sie mit Docker-Compose eine Entwicklungsumgebung für DynamoDB und Django