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)
根据文件:
DOWNLOAD_DELAY:下载程序在从同一网站下载连续页面之前应等待的时间(以秒为单位).这可用于限制爬行速度,以避免过于严重地击中服务器.
正如我们在那里看到的,此配置仅影响来自同一网站的连续页面,这是因为已分配slots爬网程序.默认情况下,scrapy为每个域设置一个插槽(因为这个想法是每个插槽都应该处理自己的速度).
现在,您还可以更改slot使用meta变量处理请求的内容download_slot,因此如果您不知道它可以做什么,请确保您没有使用该变量.
其他设置也可能会干扰DOWNLOAD_DELAY:
因此,请确保它们未启用,或者您并未尝试在同一项目中使用这两个设置.
同样重要的是指出download_delay也可以作为Spider变量启用,并且它优先于设置内部的一个.
好吧,我刚刚找到了问题的答案。
它来自我正在运行的 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 也不起作用。