Scrapy DOWNLOAD_DELAY不适用于顺序requets

Xem*_*ema 1 python api scrapy fitbit

我目前正在使用Scrapy Python库.

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

为了不强调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/[...]")
Run Code Online (Sandbox Code Playgroud)

编辑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 
Run Code Online (Sandbox Code Playgroud)

eLR*_*uLL 7

根据文件:

DOWNLOAD_DELAY:下载程序在从同一网站下载连续页面之前应等待的时间(以秒为单位).这可用于限制爬行速度,以避免过于严重地击中服务器.

正如我们在那里看到的,此配置仅影响来自同一网站的连续页面,这是因为已分配slots爬网程序.默认情况下,scrapy为每个域设置一个插槽(因为这个想法是每个插槽都应该处理自己的速度).

现在,您还可以更改slot使用meta变量处理请求的内容download_slot,因此如果您不知道它可以做什么,请确保您没有使用该变量.

其他设置也可能会干扰DOWNLOAD_DELAY:

因此,请确保它们未启用,或者您并未尝试在同一项目中使用这两个设置.

同样重要的是指出download_delay也可以作为Spider变量启用,并且它优先于设置内部的一个.


Xem*_*ema 6

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

它来自我正在运行的 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()
Run Code Online (Sandbox Code Playgroud)

现在,如果我将 CrawlerProcess 更改为:

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

我确实得到了想要的延迟!

注意:使用get_project_settings()创建 CrawlerProcess 也不起作用。