2017-12-27 1 views
1

Ich arbeite derzeit mit der Scrapy Python-Bibliothek.Scrapy DOWNLOAD_DELAY funktioniert nicht für sequentielle Requests

Zuerst mache ich einen FormRequest-Aufruf an die Fitbit-Login-Seite (https://www.fitbit.com/login), um mich einzuloggen. Dann mache ich fast 100 Anfragen an die Fitbit-API (https://api.fitbit.com).

Um die API nicht zu stressen (und nicht davon verbannt zu werden!), Wollte ich eine Verzögerung zwischen den Anfragen mit DOWNLOAD_DELAY in der Datei settings.py einstellen. Es funktioniert jedoch nicht.

Ich habe es in den Tutorials (http://scrapy.readthedocs.io/en/latest/intro/tutorial.html) getestet und es funktionierte dort richtig.

Was denkst du? Liegt es daran, dass ich eine API anfordere (die mit diesen Arten von Zugriffen umgehen soll)?

EDIT: Hier ist der Pseudo-Code meiner Spinne:

class FitbitSpider: 
    start_urls = ["https://www.fitbit.com/login"] 

    def parse(self, response): 
     yield scrapy.FormRequest(url,formdata,callback=after_login) 

    def after_login(self, response): 
     for i in range(100): 
      yield scrapy.Request("https://api.fitbit.com/[...]") 

EDIT 2: hier ist meine settings.py Datei:

BOT_NAME = 'fitbitscraper' 

SPIDER_MODULES = ['fitbitscraper.spiders'] 
NEWSPIDER_MODULE = 'fitbitscraper.spiders' 

DOWNLOAD_DELAY = 20 #20 seconds of delay should be pretty noticeable 
+0

welches Tutorial? Welchen Code hast du getestet? Zeigen Sie lieber echten Code, nicht Pseudo-Code, wenn Sie keine Pseudo-Lösungen benötigen. – furas

+0

http://scrapy.readthedocs.io/en/latest/intro/tutorial.html. Das Kratzen funktioniert einwandfrei, es sei denn, die Verzögerung wird nicht eingehalten. Und da der Code 300 Zeilen lang ist, kann ich es hier nicht geben (es wäre auch für das Thema irrelevant). – Xema

+0

Bitte zeigen Sie Ihre 'settings.py'. Wie hast du herausgefunden, dass es nicht funktioniert hat? Am besten liefern Sie vollständige Informationen. –

Antwort

0

In Ordnung, ich habe gerade die Antwort auf mein Problem gefunden.

Es kam von der Erstellung eines CrawlerProcess in der Main.py-Datei, die ich ausgeführt wurde.Die Einstellungen in der Datei settings.py wurden nicht geladen.

Zuvor tat ich das folgende:

process = CrawlerProcess({ 
    'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)' 
}) 

process.crawl(fitbit_spider.FitbitSpider) 
process.start() 

Nun, wenn ich die CrawlerProcess in ändern:

process = CrawlerProcess({ 
     'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)', 
     'DOWNLOAD_DELAY': 20 
}) 

ich tun, um die gewünschte Verzögerung bekommen!

Hinweis: mit get_project_settings() zum Erstellen der CrawlerProcess funktioniert auch nicht.

5

Nach the documentation:

DOWNLOAD_DELAY: Die Zeitspanne (in Sekunden), die der Downloader warten sollte Herunterladen fortlaufender Seiten von der gleichen Website. Dies kann verwendet werden, um die Crawling-Geschwindigkeit zu drosseln, um zu vermeiden, dass Server zu hart trifft.

Als wir dort sehen können, diese Konfiguration betrifft nur aufeinanderfolgende Seiten von derselben Website, und das ist, weil die zugeordneten slots des Crawler. Standardmäßig legt scrapy einen Slot pro Domain fest (weil die Idee darin besteht, dass jeder Slot seine eigene Geschwindigkeit verarbeiten sollte).

Jetzt können Sie auch auf dem ändern slot eine Anfrage mit den meta Variable download_slot behandelt werden könnte, so stellen Sie sicher, dass Sie nicht mit diesen Variablen spielen, wenn Sie nicht wissen, was sie tun können.

Auch andere Einstellungen können mit DOWNLOAD_DELAY wie einmischen:

So sicherstellen, dass sie nicht aktiviert sind, oder Sie versuchen, nicht beide zu verwenden Einstellungen für dasselbe Projekt.

Es ist auch wichtig darauf hinzuweisen, dass download_delay auch als Spider Variable aktiviert werden kann, und dass es Vorrang vor dem in den Einstellungen hat.

Verwandte Themen