是否可以在抓取中设置动态下载延迟



我知道可以在

settings.py
DOWNLOAD_DELAY = 2

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

爬虫能够抓取大约 10 个页面。 之后,目标页面将返回类似"您请求太频繁"的内容。

我想做的是将download_delay保持在 0。 一旦在 HTML 中找到"请求过于频繁"的消息,它将延迟更改为 2s。一段时间后,它切换回零。

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

更新:我发现这是一个名为自动油门的扩展但是它能够自定义这样的逻辑吗?

if (requesting too frequently) is found
    increase the DOWNLOAD_DELAY

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

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

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

您现在可以使用自动油门扩展。默认情况下,它处于关闭状态。您可以将这些参数添加到项目的 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
是的

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

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

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

注意:

变量"i"采用秒的形式。

最新更新