2017-02-22 11 views
1

Derzeit ist meine Struktur Flask, Redis, RabbitMQ and Celery. In meinem Kratzen verwende ich requests und BeautifulSoup. Meine Flasche läuft auf Apache und WSGI. Dies ist auf Prod. Mit app.run(threaded=True)Scraping Website mit Sellerie

Ich habe 25 APIs. 10 sind, um die URL wie Header usw. zu kratzen, und der Rest besteht darin, eine 3rd-Party-API für diese URL zu verwenden.

Ich benutze Akkord für die Verarbeitung meiner APIs und erhalten Daten von den APIs mit requests.

Für meine Akkord-Header habe ich 3 Arbeiter, während auf meinem Rückruf ich nur 1. Ich habe ein Engpass Problem mit ConnectTimeoutError und MaxRetryError. Als ich einen Thread las, sagte er, dass er einen Timeout für jeden Prozess machen sollte, weil dieser Fehler bedeutet, dass Sie den Remote-Server überladen.

Das Problem ist, da ich einen Akkord verwende, hat es keinen Sinn, eine Zeit Schlaf zu verwenden, da der 25 API-Aufruf zur gleichen Zeit ausgeführt wird. Ist das jemand begegnet? Oder mache ich das falsch?

Der Thread, den ich lese, scheint zu sagen, die Anforderungen zu pycurl zu ändern oder Scrapy zu verwenden. Aber ich denke nicht, dass das der Fall ist, da ConnectTimeoutError über meinen Host ist, der einen spezifischen URL-Server überlädt.

Mein Akkord Prozess:

callback = create_document.s(url, company_logo, api_list) 
header = [api_request.s(key) for key in api_list.keys()] 
result = chord(header)(callback) 

In api_request Aufgabenanforderungen verwendet wird.

Antwort

0

Wenn Sie die Anzahl der gleichzeitig ausgeführten Scrapes begrenzen möchten, können Sie eine Enqueue-Task erstellen, die überprüft, ob eine andere Task mit denselben Eigenschaften wie die auszuführende Task ausgeführt wird. Wenn die Aufgabe ausgeführt wird, sagen Sie ihr, dass sie für ein paar Sekunden in den Ruhezustand versetzt werden soll, und überprüfen Sie sie erneut. Wenn er sieht, dass einer nicht ausgeführt wird, können Sie die Aufgabe, die Sie ausführen möchten, in die Warteschlange stellen. Dadurch können Sie mit asynchronen Tasks schlafen. Sie können sogar die Aufgaben zählen und mehr ausführen, wenn nur eine bestimmte Anzahl ausgeführt wird. Mit diesem können Sie 5 zu einem Zeitpunkt ausgeführt und sehen, ob es gedrosselt wird ein anderes genug dann Warteschlange, wenn Sie ein beendet usw. sehen

:: EDIT ::

Documentation for Celery Inspect

+0

Haben Sie einen Link zu eine Dokumentation oder ein Beispielcode? – Bazinga

+0

Ich habe einen Referenzlink für Sie hinzugefügt. –