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

是否可以在scrapy中设置动态下载延迟?,scrapy,web-crawler,delay,Scrapy,Web Crawler,Delay,我知道,可以设置一个恒定的延迟 settings.py DOWNLOAD_DELAY = 2 但是,如果我将延迟设置为2秒,则效率不够。如果我将下载延迟设置为0 该爬虫程序能够抓取大约10页。之后,目标页面将返回类似“您的请求过于频繁”的内容 我想做的是将下载延迟保持为0。一旦在html中找到“请求太频繁”消息。它将延迟更改为2秒。过了一会儿,它又回到零 是否有任何模块可以做到这一点?还是其他更好的办法来处理这类案件 更新: 我发现那是分机电话 但是它能定制一些像这样的逻辑吗 if (requ

我知道,可以设置一个恒定的延迟

settings.py
DOWNLOAD_DELAY = 2
但是,如果我将延迟设置为2秒,则效率不够。如果我将下载延迟设置为0

该爬虫程序能够抓取大约10页。之后,目标页面将返回类似“您的请求过于频繁”的内容

我想做的是将下载延迟保持为0。一旦在html中找到“请求太频繁”消息。它将延迟更改为2秒。过了一会儿,它又回到零

是否有任何模块可以做到这一点?还是其他更好的办法来处理这类案件

更新: 我发现那是分机电话 但是它能定制一些像这样的逻辑吗

if (requesting too frequently) is found
    increase the DOWNLOAD_DELAY

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

import time

for i in range(10):
   *** Operations 1****
   time.sleep( i )
   *** Operations 2****
现在您可以看到操作1和操作2之间的延迟

注:


变量“i”的形式为秒。

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

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

相反,您可以尝试了解您的目标服务器允许的速度,可能是1.5s、1s、0.7s、0.5s等。然后,您可以考虑爬虫程序可以实现的吞吐量来重新设计产品。

您现在可以使用。默认情况下,它处于关闭状态。可以在项目的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

这正是Autothrottle所做的;你也可以设置它的限制。sleep对scrapy不起作用,它使用的是用twisted构建的asyc api。