如何在scrapy中的每个请求之间给出延迟?

时间:2012-01-07 08:44:33

标签: scrapy

我不想同时抓取并被阻止。我想每秒发送一个请求。

6 个答案:

答案 0 :(得分:57)

有一个setting

  

DOWNLOAD_DELAY

     

默认值:0

     

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

DOWNLOAD_DELAY = 0.25    # 250 ms of delay

阅读文档:https://doc.scrapy.org/en/latest/index.html

答案 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);
}