AutoThrottle 拡張機能¶
これは, ScrapyサーバーとクロールしているWebサイトの両方の負荷に基づいてクロール速度を自動的に調整する拡張機能です.
設計目標¶
- 既定のダウンロード遅延ゼロを使用する代わりに, サイトをより良くする
- 自動的に最適なクロール速度に調整し, ユーザーはダウンロード遅延をチューニングして最適なものを見つける必要がない. ユーザーは許可する同時要求の最大数を指定するだけで, 残りの部分は拡張機能で処理する.
使い方¶
AutoThrottle拡張機能はダウンロード遅延を動的に調整して, スパイダーが
AUTOTHROTTLE_TARGET_CONCURRENCY
の同時リクエストを各リモートWebサイトに送信します.
ダウンロード待ち時間を使用して遅延を計算します.
主な考え方は次のとおりです: サーバが応答するのに 待ち時間
が必要な場合, クライアントは
N
個の要求を並行して処理するために, 各 待ち時間/ N
秒間に要求を送信する必要があります.
遅延を調整する代わりに, 一定のダウンロード遅延を設定し,
CONCURRENT_REQUESTS_PER_DOMAIN
または
CONCURRENT_REQUESTS_PER_IP
オプションを使用して並行性に厳しい制限を課すことができます.
同様の効果が得られますが, いくつかの重要な違いがあります:
- ダウンロードの遅延が小さいため, 時折リクエストが激しくなります.
- 多くの場合, non-200 (エラー) レスポンスは通常の応答より速く返される可能性があるため, サーバーがエラーを返すようになると, ダウンロードの遅延が少なく, 並行処理の制限が厳しいため, クローラはサーバーに要求を高速に送信します. しかし, これはクローラが行うべきこととは反対です. エラーの場合, 遅くするのがより理にかなっています.
オートスロットルにはこれらの問題はありません.
スロットルアルゴリズム¶
オートスロットルアルゴリズムは, 次のルールに基づいてダウンロードの遅延を調整します:
- スパイダーは常に
AUTOTHROTTLE_START_DELAY
のダウンロード遅延で始まります. - レスポンスが受信されると, ターゲットダウンロード遅延は,
latency
がレスポンスのレイテンシであるlatency / N
として計算されます.N
はAUTOTHROTTLE_TARGET_CONCURRENCY
の値です. - 次の要求のダウンロード遅延は, 前回のダウンロード遅延と目標のダウンロード遅延の平均値に設定されます.
- レイテンシの non-200 レスポンス待ち時間は遅延を減少させることができません.
- ダウンロードの遅延が
DOWNLOAD_DELAY
より小さくなることも,AUTOTHROTTLE_MAX_DELAY
より大きくなることもできません.
注釈
AutoThrottle拡張機能は, 標準的なScrapyの設定の並行性と遅延を優先します.
これは, CONCURRENT_REQUESTS_PER_DOMAIN
オプションと
CONCURRENT_REQUESTS_PER_IP
オプションを尊重し, ダウンロード遅延を
DOWNLOAD_DELAY
よりも低く設定しないことを意味します.
Scrapyでは, ダウンロードの待ち時間は, TCP接続を確立してからHTTPヘッダーを受信するまでの経過時間として測定されます.
これらのレイテンシは, Scrapyがスパイダーコールバックを処理するのに忙しく, ダウンロードに参加できないために, 協調的なマルチタスク環境では正確に測定することが非常に難しいことに注意してください. しかし, これらのレイテンシは, Scrapy(そして最終的にはサーバー)がどの程度忙しいかについての妥当な見積もりを与えるはずであり, この拡張はその前提に基づいています.
設定¶
オートスロットルエクステンションを制御するための設定以下です:
AUTOTHROTTLE_ENABLED
AUTOTHROTTLE_START_DELAY
AUTOTHROTTLE_MAX_DELAY
AUTOTHROTTLE_DEBUG
CONCURRENT_REQUESTS_PER_DOMAIN
CONCURRENT_REQUESTS_PER_IP
DOWNLOAD_DELAY
詳細については, 使い方 を参照してください.
AUTOTHROTTLE_TARGET_CONCURRENCY¶
バージョン 1.1 で追加.
デフォルト: 1.0
リモートWebサイトと並行して送信する必要があるリクエストの平均数.
デフォルトでは, AutoThrottleは, 1つの同時リクエストを各リモートWebサイトに送信する遅延を調整します.
このオプションをより高い値(たとえば 2.0
)に設定すると, リモートサーバーのスループットと負荷が増加します.
AUTOTHROTTLE_TARGET_CONCURRENCY
が小さいほど( 0.5
など), クローラはより控えめで丁寧なものになります.
AutoThrottle拡張機能が有効な場合, CONCURRENT_REQUESTS_PER_DOMAIN
および CONCURRENT_REQUESTS_PER_IP
オプションは引き続き考慮されます. This means that if
AUTOTHROTTLE_TARGET_CONCURRENCY
が
CONCURRENT_REQUESTS_PER_DOMAIN
または
CONCURRENT_REQUESTS_PER_IP
より高い値に設定されていると, クローラはこの数の同時要求に達しません.
与えられたすべての時点で, Scrapyは AUTOTHROTTLE_TARGET_CONCURRENCY
よりも多かれ少なかれ並行した要求を送ることができます.
クローラがアプローチしようとする推奨値であり, ハードな制限ではありません.
AUTOTHROTTLE_DEBUG¶
デフォルト: False
受信したすべてのレスポンスの統計情報を表示する AutoThrottle デバッグモードを有効にすると, 調整パラメータがリアルタイムでどのように調整されているかがわかります.