Scrapy DOWNLOAD_DELAY不适用于顺序requets

时间:2017-12-27 15:25:37

标签: python api scrapy fitbit

我目前正在使用Scrapy Python库。

首先,我向Fitbit的登录页面(https://www.fitbit.com/login)发出FormRequest调用以登录。然后,我向Fitbit的API发出了近100个请求({{3} })。

为了不强调API(并且不被禁止!),我想在settings.py文件中使用DOWNLOAD_DELAY在请求之间设置延迟。但它没有用。

我在教程(https://api.fitbit.com)中对它进行了测试,并且它在那里正常运行。

你怎么看?是因为我要求一个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 

2 个答案:

答案 0 :(得分:5)

根据the documentation

  

DOWNLOAD_DELAY:下载器从同一页面下载连续页面之前应等待的时间(以秒为单位)   网站。这可以用来限制爬行速度以避免   很难打到服务器。

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

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

其他设置也可能会干扰download_delay,如:

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

同样重要的是要指出Spider也可以作为LET results1 = ["1","2"] LET results2 = ["3","4"] FOR x IN UNION(results1, results2) RETURN x 变量启用,并且它优先于设置中的一个。

答案 1 :(得分: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也不起作用。