是否可以在scrapy中设置动态下载延迟?

时间:2014-12-03 08:27:32

标签: scrapy web-crawler delay

我知道可以在

中设置恒定延迟
settings.py
DOWNLOAD_DELAY = 2

但是,如果我将延迟设置为2秒,则效率不高。如果我设置DOWNLOAD_DELAY = 0。

抓取工具可以抓取大约10页。之后,目标页面将返回“您请求过于频繁”的内容。

我想要做的是在html中找到“请求太频繁”的msg后,将download_delay保持为0。它将延迟更改为2秒。过了一会儿,它会切换回零。

有没有模块可以做到这一点?或任何其他更好的想法来处理这种情况?

更新: 我发现这是一个分机号AutoThrottle 但它是否能够自定义一些像这样的逻辑?

if (requesting too frequently) is found
    increase the DOWNLOAD_DELAY

3 个答案:

答案 0 :(得分:0)

如果您在获得反蜘蛛页面之后,那么在2秒内您就可以获得数据页面,那么您所要求的可能需要编写一个下载中间件 检查反蜘蛛页面,将所有已调度的请求重置为更新队列,当蜘蛛空闲时从更新队列获取请求时启动循环调用(循环间隔是您的新下载延迟的黑客攻击),以及尝试确定何时不再需要下载延迟(需要一些测试),然后停止循环并将续订队列中的所有请求重新安排到scrapy调度程序。在分布式爬网的情况下,您将需要使用redis队列。

将下载延迟设置为0,根据我的经验,吞吐量可以轻松超过1000项/分钟。如果在10个响应之后弹出反蜘蛛页面,则不值得努力。

相反,也许您可​​以尝试找出目标服务器允许的速度,可能是1.5秒,1秒,0.7秒,0.5秒等。然后可能重新设计您的产品,考虑到您的爬虫可以实现的吞吐量。

答案 1 :(得分:0)

您现在可以使用Auto Throttle extension。它默认关闭。您可以在项目的settings.py文件中添加这些参数以启用它。

AUTOTHROTTLE_ENABLED = True
# The initial download delay
AUTOTHROTTLE_START_DELAY = 5
# The maximum download delay to be set in case of high latencies
AUTOTHROTTLE_MAX_DELAY = 300
# The average number of requests Scrapy should be sending in parallel to
# each remote server
AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0
# Enable showing throttling stats for every response received:
AUTOTHROTTLE_DEBUG = True

答案 2 :(得分:-2)

是,您可以使用时间模块设置动态延迟。

import time

for i in range(10):
   *** Operations 1****
   time.sleep( i )
   *** Operations 2****

现在您可以看到操作1和操作2之间的延迟。

注意:

变量' i'以秒为单位。