AutoThrottle 扩展
这是一个用于根据 Scrapy 服务器和您正在抓取的网站的负载自动调节抓取速度的扩展。
设计目标
对网站更友好,而不是使用默认的零下载延迟
自动将 Scrapy 调整到最佳抓取速度,这样用户就不必调整下载延迟来找到最佳值。用户只需指定允许的最大并发 Request 数,其余由扩展完成。
工作原理
Scrapy 允许定义不同下载槽的并发和延迟,例如通过 DOWNLOAD_SLOTS
设置。默认情况下,Request 根据其 URL 域分配到槽中,但也可以自定义任何 Request 的下载槽。
AutoThrottle 扩展动态调整每个下载槽的延迟,以使您的爬虫平均向每个远程网站发送 AUTOTHROTTLE_TARGET_CONCURRENCY
个并发 Request。
它使用下载延迟来计算延迟。主要思想如下:如果服务器需要 latency
秒响应,客户端应每 latency/N
秒发送一个 Request,以便并行处理 N
个 Request。
与其调整延迟,不如设置一个较小的固定下载延迟,并使用 CONCURRENT_REQUESTS_PER_DOMAIN
或 CONCURRENT_REQUESTS_PER_IP
选项施加硬性的并发限制。这会产生类似的效果,但有一些重要区别
由于下载延迟较小,偶尔会出现请求爆发;
通常非 200(错误)响应返回速度比常规响应快,因此在下载延迟较小和并发限制严格的情况下,当服务器开始返回错误时,爬虫会更快地向服务器发送请求。但这与爬虫应有的行为相反——出现错误时,减慢速度更有意义:这些错误可能由高请求率引起。
AutoThrottle 没有这些问题。
节流算法
AutoThrottle 算法根据以下规则调整下载延迟
爬虫总是以
AUTOTHROTTLE_START_DELAY
的下载延迟开始;收到 Response 后,目标下载延迟计算为
latency / N
,其中latency
是该 Response 的延迟,N
是AUTOTHROTTLE_TARGET_CONCURRENCY
。后续 Request 的下载延迟设置为之前的下载延迟和目标下载延迟的平均值;
不允许非 200 Response 的延迟减少延迟;
下载延迟不能小于
DOWNLOAD_DELAY
或大于AUTOTHROTTLE_MAX_DELAY
注意
AutoThrottle 扩展遵循 Scrapy 关于并发和延迟的标准设置。这意味着它会遵守 CONCURRENT_REQUESTS_PER_DOMAIN
和 CONCURRENT_REQUESTS_PER_IP
选项,并且绝不会将下载延迟设置低于 DOWNLOAD_DELAY
。
在 Scrapy 中,下载延迟被测量为建立 TCP 连接和接收 HTTP 头部之间经过的时间。
请注意,在协作式多任务环境中很难准确测量这些延迟,因为 Scrapy 可能正忙于处理爬虫回调等,而无法处理下载。然而,这些延迟仍然可以合理估计 Scrapy(最终是服务器)的繁忙程度,此扩展正是基于这一前提构建的。
阻止特定 Request 触发槽延迟调整
AutoThrottle 根据属于该下载槽的 Response 延迟来调整下载槽的延迟。唯一的例外是非 200 Response,它们仅在用于增加延迟时被考虑,如果会减少延迟则被忽略。
您还可以在任何 Request 中将 autothrottle_dont_adjust_delay
Request 元数据键设置为 True
,以防止其 Response 延迟影响其下载槽的延迟
from scrapy import Request
Request("https://example.com", meta={"autothrottle_dont_adjust_delay": True})
然而请注意,AutoThrottle 仍然通过设置运行中爬虫的 download_delay
属性来确定每个下载槽的起始延迟。如果您希望 AutoThrottle 完全不影响某个下载槽,除了在使用该下载槽的所有 Request 中设置此 meta 键外,您可能还需要为该下载槽的 delay
属性设置一个自定义值,例如使用 DOWNLOAD_SLOTS
。
设置
用于控制 AutoThrottle 扩展的设置有
更多信息请参阅工作原理。
AUTOTHROTTLE_ENABLED
默认值: False
启用 AutoThrottle 扩展。
AUTOTHROTTLE_START_DELAY
默认值: 5.0
初始下载延迟(秒)。
AUTOTHROTTLE_MAX_DELAY
默认值: 60.0
在高延迟情况下设置的最大下载延迟(秒)。
AUTOTHROTTLE_TARGET_CONCURRENCY
默认值: 1.0
Scrapy 应平均并行发送到远程网站的 Request 数。必须高于 0.0
。
默认情况下,AutoThrottle 调整延迟以向每个远程网站发送单个并发 Request。将此选项设置为更高值(例如 2.0
)以提高吞吐量并增加远程服务器的负载。较低的 AUTOTHROTTLE_TARGET_CONCURRENCY
值(例如 0.5
)会使爬虫更保守和友好。
请注意,启用 AutoThrottle 扩展时,CONCURRENT_REQUESTS_PER_DOMAIN
和 CONCURRENT_REQUESTS_PER_IP
选项仍然有效。这意味着如果 AUTOTHROTTLE_TARGET_CONCURRENCY
设置的值高于 CONCURRENT_REQUESTS_PER_DOMAIN
或 CONCURRENT_REQUESTS_PER_IP
,爬虫将无法达到此并发 Request 数。
在任何给定时间点,Scrapy 发送的并发 Request 数可能多于或少于 AUTOTHROTTLE_TARGET_CONCURRENCY
;这是一个爬虫试图接近的建议值,而不是硬性限制。
AUTOTHROTTLE_DEBUG
默认值: False
启用 AutoThrottle 调试模式,该模式将显示收到的每个 Response 的统计信息,以便您可以实时查看节流参数如何调整。