我知道可以在
中设置恒定延迟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
答案 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'以秒为单位。