我目前正在使用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
答案 0 :(得分:5)
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也不起作用。