2017-12-27 454 views
1

我目前正在使用Scrapy Python库。Scrapy DOWNLOAD_DELAY不适用于顺序请求

首先,我对Fitbit的登录页面(https://www.fitbit.com/login)进行FormRequest调用以记录自己的身份。然后,我向Fitbit的API(https://api.fitbit.com)发出近100条请求。

为了不压制API(并且不会被禁止!),我想在settings.py文件中使用DOWNLOAD_DELAY设置请求之间的延迟。但它不起作用。

我正在测试它的教程(http://scrapy.readthedocs.io/en/latest/intro/tutorial.html),它在那里工作正常。

您认为如何?是否因为我请求一个API(应该处理这些访问)?

编辑:这里是我的蜘蛛的伪代码:

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/[...]") 

编辑2:这里是我的settings.py文件:

BOT_NAME = 'fitbitscraper' 

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

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

什么教程?你测试了什么代码?如果你不需要伪解决方案,最好展示真实的代码,而不是伪代码。 – furas

+0

http://scrapy.readthedocs.io/en/latest/intro/tutorial.html。刮除工作正常,除非没有观察到延迟。而且因为代码是300线长,我不能在这里给它(这将是无关的话题,以及,我相信)。 – Xema

+0

请显示你的'settings.py'。另外,你是如何发现它不起作用的?最好提供完整的信息。 –

回答

0

好吧,我刚刚找到了我的问题的答案。

它来自我在运行的main.py文件中创建一个CrawlerProcess。它没有加载settings.py文件中的设置。

在此之前我做了以下内容:

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

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

现在,如果我改变CrawlerProcess到:

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

我得到想要的延迟!

注意:在使用get_project_settings()创建CrawlerProcess不工作要么。

5

根据the documentation

DOWNLOAD_DELAY:下载器在等待的时间(以秒为单位)从相同的 网站下载连续页面。这可以用来限制爬行速度,以避免 太难以击中服务器。

正如我们可以看到,这个配置只影响在同一网站上连续的页面,那就是因为履带式的分配slots的。默认情况下,scrapy为每个域设置一个插槽(因为这个想法是每个插槽都应该处理它自己的速度)。现在

,你也可以改变上slot的请求可以与meta变量download_slot进行处理,所以一定要确保你不与该变量玩,如果你不知道什么可以做的。

另外,其它设置可以DOWNLOAD_DELAY像干扰:

所以要确保它们不会启用,或者你是不是想同时使用在同一个项目上的设置。

另外需要指出的是,download_delay也可以作为Spider变量启用,并且它优先于Settings中的一个。

相关问题