Python scrapy ReactorNotRestartable Ersatz

8

Ich habe versucht, eine App in Python mit Scrapy zu erstellen, die die folgende Funktionalität hat:

  • Ein rest api (ich hatte das mit flask gemacht) hört alle Anfragen zum Crawlen / Verwerfen ab und gibt die Antwort nach dem Crawlen zurück (der Crawling-Teil ist kurz genug) , so dass die Verbindung aufrechterhalten werden kann, bis das Crawling abgeschlossen ist.)

Ich kann dies mit dem folgenden Code tun:

%Vor%

Jetzt ist das Problem, dem ich gegenüberstehe, nachdem ich den Reaktor gestoppt habe (was mir notwendig erscheint, weil ich nicht bei der reactor.run() hängen bleiben will). Ich konnte die weitere Anfrage nach erster Anfrage nicht annehmen. Nachdem die erste Anfrage abgeschlossen wurde, wurde der folgende Fehler angezeigt:

%Vor%

Das ist offensichtlich, da wir den Reaktor nicht starten können.

Meine Fragen sind also:

1) Wie kann ich die nächsten Crawling-Anfragen unterstützen?

2) Gibt es eine Möglichkeit, nach reactor.run () in die nächste Zeile zu wechseln, ohne sie zu stoppen?

    
sagar 11.09.2016, 08:52
quelle

2 Antworten

1

Hier ist eine einfache Lösung für Ihr Problem

%Vor%

In der obigen Lösung gehe ich davon aus, dass Sie in der Lage sind, Ihren Crawler über die Befehlszeile zu starten, indem Sie die Datei start_request.py in der Shell / Befehlszeile verwenden.

Wir verwenden nun Threading in Python, um einen neuen Thread für jede eingehende Anfrage zu starten. Jetzt können Sie Ihre Crawler-Instanz für jeden Treffer einfach parallel ausführen. Steuern Sie die Anzahl der Threads mit threading.activeCount ()

    
Dinesh Agrawal 16.09.2016, 15:45
quelle
1

Ich empfehle Ihnen, ein Warteschlangensystem wie Rq zu benutzen (der Einfachheit halber, aber es gibt nur wenige andere).
Sie könnten eine Craw-Funktion haben:

%Vor%

Verwenden Sie dann in Ihrem Hauptcode die Rq-Warteschlange, um Crawler-Ausführungen zu sammeln:

%Vor%

Vergessen Sie nicht, einen rq-Worker-Prozess zu starten, der für den gleichen Warteschlangennamen arbeitet (hier parse ). Beispielsweise in einer Terminalsitzung ausführen:

%Vor%     
Evhz 15.09.2016 16:46
quelle