我不想同时抓取并被阻止。我想每秒发送一个请求。
答案 0 :(得分:57)
有一个setting:
DOWNLOAD_DELAY
默认值:
0
下载者之前应该等待的时间(以秒为单位) 从同一网站下载连续页面。这可以使用 限制爬行速度以避免过于严重地击中服务器。
DOWNLOAD_DELAY = 0.25 # 250 ms of delay
答案 1 :(得分:18)
如果您不想要全局下载延迟,也可以在spider上设置'download_delay'属性。见http://doc.scrapy.org/en/latest/faq.html#what-does-the-response-status-code-999-means
答案 2 :(得分:8)
class S(Spider):
rate = 1
def __init__(self):
self.download_delay = 1/float(self.rate)
rate 设置可在一秒钟内下载的最大页数。
答案 3 :(得分:5)
延迟我们可以在2中说: -
我们可以在运行抓取工具时指定延迟。 例如。 scrapy crawl sample --set DOWNLOAD_DELAY = 3(这意味着两个请求之间有3秒的延迟)
否则我们可以在settings.py中指定Globaly DOWNLOAD_DELAY = 3
默认情况下,scrapy在2个请求之间延迟0.25秒。
答案 4 :(得分:5)
如果你想保持一秒的下载延迟,设置DOWNLOAD_DELAY=1
就是这样做的。
但scrapy还具有自动设置名为AutoThrottle
的下载延迟的功能。它会根据Scrapy服务器和您正在抓取的网站的负载自动设置延迟。这比设置任意延迟更有效。
在http://doc.scrapy.org/en/1.0/topics/autothrottle.html#autothrottle-extension上进一步了解详情 我已经抓取了超过100个域名,并且没有被AutoThrottle打开阻止
答案 5 :(得分:4)
除了DOWNLOAD_DELAY,您还可以使用scrapy的AUTOTHROTTLE功能, https://doc.scrapy.org/en/latest/topics/autothrottle.html
根据设置文件更改请求之间的延迟量。如果为开始和最大延迟设置1,则在每个请求中等待1秒。
最初的目的是改变延迟时间,因此检测机器人会更难。
您只需在settings.py中进行设置,如下所示:
if (document.selection) { //IE
var range = document.body.createTextRange();
range.moveToElementText(document.getElementById(containerid));
range.select();
} else if (window.getSelection) { //others
var range = document.createRange();
range.selectNode(document.getElementById(containerid));
window.getSelection().addRange(range);
}