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