# AutoThrottle 擴展
> 譯者:[OSGeo 中國](https://www.osgeo.cn/)
這是一個擴展,基于Scrapy服務器和您正在爬行的網站的負載,自動限制爬行速度。
## 設計目標
1. 對站點更好,而不是使用默認的下載延遲為零
2. 自動調整碎片到最佳的爬行速度,這樣用戶就不必調整下載延遲來找到最佳的。用戶只需要指定它允許的最大并發請求,擴展就可以完成其余的工作。
## 它是如何工作的
AutoThrottle 擴展動態調整下載延遲,使 Spider 發送 [`AUTOTHROTTLE_TARGET_CONCURRENCY`](#std:setting-AUTOTHROTTLE_TARGET_CONCURRENCY) 平均每個遠程網站的并發請求。
它使用下載延遲來計算延遲。主要思想如下:如果服務器需要 `latency` 響應時間為秒,客戶端應每秒鐘發送一個請求 `latency/N` 秒有 `N` 并行處理的請求。
不需要調整延遲,只需設置一個小的固定下載延遲,并對使用 [`CONCURRENT_REQUESTS_PER_DOMAIN`](settings.html#std:setting-CONCURRENT_REQUESTS_PER_DOMAIN) 或 [`CONCURRENT_REQUESTS_PER_IP`](settings.html#std:setting-CONCURRENT_REQUESTS_PER_IP) 選項。它會產生類似的效果,但有一些重要的區別:
* 因為下載延遲很小,偶爾會有突發的請求;
* 通常,非200(錯誤)響應的返回速度比常規響應快,因此,只要有一個較小的下載延遲和硬并發限制,當服務器開始返回錯誤時,爬蟲程序將更快地向服務器發送請求。但這與爬蟲應該做的相反——如果出現錯誤,放慢速度更有意義:這些錯誤可能是由高請求率引起的。
AutoThrottle 沒有這些問題。
## 節流算法
AutoThrottle 算法根據以下規則調整下載延遲:
1. Spider 總是以下載延遲開始 [`AUTOTHROTTLE_START_DELAY`](#std:setting-AUTOTHROTTLE_START_DELAY) ;
2. 當收到響應時,目標下載延遲計算為 `latency / N` 在哪里? `latency` 是響應的延遲,并且 `N` 是 [`AUTOTHROTTLE_TARGET_CONCURRENCY`](#std:setting-AUTOTHROTTLE_TARGET_CONCURRENCY) .
3. 下一個請求的下載延遲設置為上一個下載延遲和目標下載延遲的平均值;
4. 不允許非200響應的延遲減少延遲;
5. 下載延遲不能小于 [`DOWNLOAD_DELAY`](settings.html#std:setting-DOWNLOAD_DELAY) 或大于 [`AUTOTHROTTLE_MAX_DELAY`](#std:setting-AUTOTHROTTLE_MAX_DELAY)
注解
autothrottle擴展支持并發和延遲的標準碎片設置。這意味著它將尊重 [`CONCURRENT_REQUESTS_PER_DOMAIN`](settings.html#std:setting-CONCURRENT_REQUESTS_PER_DOMAIN) 和 [`CONCURRENT_REQUESTS_PER_IP`](settings.html#std:setting-CONCURRENT_REQUESTS_PER_IP) 選項,并且從不將下載延遲設置為低于 [`DOWNLOAD_DELAY`](settings.html#std:setting-DOWNLOAD_DELAY) .
在scrappy中,下載延遲是以建立TCP連接和接收HTTP頭之間所經過的時間來度量的。
注意,在一個合作的多任務環境中,這些延遲很難精確測量,因為scrapy可能正忙于處理spider回調,例如,無法參加下載。然而,這些延遲仍然應該對Scrapy(最終是服務器)有多忙給出一個合理的估計,并且這個擴展是在這個前提下構建的。
## 設置
用于控制 AutoThrottle 擴展的設置為:
* [`AUTOTHROTTLE_ENABLED`](#std:setting-AUTOTHROTTLE_ENABLED)
* [`AUTOTHROTTLE_START_DELAY`](#std:setting-AUTOTHROTTLE_START_DELAY)
* [`AUTOTHROTTLE_MAX_DELAY`](#std:setting-AUTOTHROTTLE_MAX_DELAY)
* [`AUTOTHROTTLE_TARGET_CONCURRENCY`](#std:setting-AUTOTHROTTLE_TARGET_CONCURRENCY)
* [`AUTOTHROTTLE_DEBUG`](#std:setting-AUTOTHROTTLE_DEBUG)
* [`CONCURRENT_REQUESTS_PER_DOMAIN`](settings.html#std:setting-CONCURRENT_REQUESTS_PER_DOMAIN)
* [`CONCURRENT_REQUESTS_PER_IP`](settings.html#std:setting-CONCURRENT_REQUESTS_PER_IP)
* [`DOWNLOAD_DELAY`](settings.html#std:setting-DOWNLOAD_DELAY)
有關詳細信息,請參閱 [它是如何工作的](#autothrottle-algorithm) .
### AUTOTHROTTLE_ENABLED
違約: `False`
啟用AutoThrottle 擴展。
### AUTOTHROTTLE_START_DELAY
違約: `5.0`
初始下載延遲(秒)。
### AUTOTHROTTLE_MAX_DELAY
違約: `60.0`
在高延遲情況下設置的最大下載延遲(秒)。
### AUTOTHROTTLE_TARGET_CONCURRENCY
1.1 新版功能.
違約: `1.0`
Scrapy的平均請求數應與遠程網站并行發送。
默認情況下,autothrottle會調整延遲以向每個遠程網站發送單個并發請求。將此選項設置為更高的值(例如 `2.0` )以增加遠程服務器的吞吐量和負載。下層 `AUTOTHROTTLE_TARGET_CONCURRENCY` 價值(例如) `0.5` )讓爬蟲人更加保守和禮貌。
注意 [`CONCURRENT_REQUESTS_PER_DOMAIN`](settings.html#std:setting-CONCURRENT_REQUESTS_PER_DOMAIN) 和 [`CONCURRENT_REQUESTS_PER_IP`](settings.html#std:setting-CONCURRENT_REQUESTS_PER_IP) 啟用 AutoThrottle 擴展功能時,仍會遵循選項。這意味著如果 `AUTOTHROTTLE_TARGET_CONCURRENCY` 設置為大于的值 [`CONCURRENT_REQUESTS_PER_DOMAIN`](settings.html#std:setting-CONCURRENT_REQUESTS_PER_DOMAIN) 或 [`CONCURRENT_REQUESTS_PER_IP`](settings.html#std:setting-CONCURRENT_REQUESTS_PER_IP) ,爬蟲程序將無法達到此數量的并發請求。
在每個給定的時間點上,scrapy可以發送的并發請求多于或少于 `AUTOTHROTTLE_TARGET_CONCURRENCY` ;這是爬蟲嘗試接近的建議值,而不是硬限制。
### AUTOTHROTTLE_DEBUG
違約: `False`
啟用 AutoThrottle 調試模式,該模式將顯示收到的每個響應的統計信息,以便您可以看到如何實時調整節流參數。
- 簡介
- 第一步
- Scrapy at a glance
- 安裝指南
- Scrapy 教程
- 實例
- 基本概念
- 命令行工具
- Spider
- 選擇器
- 項目
- 項目加載器
- Scrapy shell
- 項目管道
- Feed 導出
- 請求和響應
- 鏈接提取器
- 設置
- 例外情況
- 內置服務
- Logging
- 統計數據集合
- 發送電子郵件
- 遠程登錄控制臺
- Web服務
- 解決具體問題
- 常見問題
- 調試spiders
- Spider 合約
- 常用做法
- 通用爬蟲
- 使用瀏覽器的開發人員工具進行抓取
- 調試內存泄漏
- 下載和處理文件和圖像
- 部署 Spider
- AutoThrottle 擴展
- Benchmarking
- 作業:暫停和恢復爬行
- 延伸 Scrapy
- 體系結構概述
- 下載器中間件
- Spider 中間件
- 擴展
- 核心API
- 信號
- 條目導出器
- 其余所有
- 發行說明
- 為 Scrapy 貢獻
- 版本控制和API穩定性