AutoThrottle拡張機能

これは、ScrapyサーバーとクロールするWebサイトの両方の負荷に基づいて、クロール速度を自動的に落とすための拡張機能です。

設計目標

  1. デフォルト・ゼロのダウンロード遅延を使用する代わりに、サイトに優しくする

  2. Scrapyを最適なクロール速度に自動的に調整するので、ユーザーは最適なものを見つけるためにダウンロードの遅延を調整する必要がありません。 ユーザーは、許可する同時要求の最大数を指定するだけでよく、拡張機能が残りを行います。

仕組み

AutoThrottle拡張機能はダウンロード遅延を動的に調整して、スパイダーが各リモートWebサイトに平均的に AUTOTHROTTLE_TARGET_CONCURRENCY 並列リクエストを送信するようにします。

ダウンロード遅延を使用して遅延を計算します。主なアイデアは次のとおりです。サーバーが応答するのに latency 秒が必要な場合、クライアントは latency/N 秒ごとにリクエストを送信して、N 個のリクエストを並行して処理する必要があります。

遅延を調整する代わりに、小さな固定ダウンロード遅延を設定し、 CONCURRENT_REQUESTS_PER_DOMAIN または CONCURRENT_REQUESTS_PER_IP オプションを使用して同時実行に厳しい制限を課すことができます。この2つは同様の効果を提供しますが、いくつかの重要な違いがあります:

  • ダウンロードの遅延が小さいため、リクエストのバーストがときどき発生します;

  • 多くの場合、200以外の(エラー)レスポンスは通常のレスポンスよりも速く返される可能性があるため、サーバーがエラーを返し始めると、ダウンロード遅延が小さく、ハード同時実行制限のクローラーがサーバーにリクエストをより速く送信します。 しかし、これはクローラーが行うべきことの反対です。エラーが発生した場合、速度を落とすのがより理にかなっています。これらのエラーはリクエスト率が高いことが原因である可能性があります。

AutoThrottleにはこれらの問題はありません。

速度を絞るアルゴリズム

AutoThrottleアルゴリズムは、次のルールに基づいてダウンロード遅延を調整します:

  1. スパイダーは常に AUTOTHROTTLE_START_DELAY のダウンロード遅延で始まります;

  2. レスポンスが受信されると、ターゲットのダウンロード遅延は latency / N として計算されます。 latency は応答の遅延であり、 NAUTOTHROTTLE_TARGET_CONCURRENCY です。

  3. 次のリクエストのダウンロード遅延は、以前のダウンロード遅延とターゲット・ダウンロード遅延の平均に設定されます;

  4. 200以外のレスポンスのレイテンシ(latency)では、遅延を減らすことはできません;

  5. ダウンロードの遅延が DOWNLOAD_DELAY よりも小さくなったり、 AUTOTHROTTLE_MAX_DELAY よりも大きくなったりすることはできません

注釈

AutoThrottle拡張機能は、並列性と遅延の標準的なScrapy設定を優先します。これは、 CONCURRENT_REQUESTS_PER_DOMAINCONCURRENT_REQUESTS_PER_IP オプションを尊重し、かつ、 DOWNLOAD_DELAY よりも低いダウンロード遅延を設定しないことを意味します。

Scrapyでは、ダウンロードの遅延は、TCP接続の確立からHTTPヘッダーの受信までの経過時間として測定されます。

Scrapyは、例えば、スパイダー・コールバックの処理に忙しいとダウンロードに参加できないため、これらのレイテンシ(latency)を協調マルチタスク環境で正確に測定するのは非常に難しいことに注意してください。 ただし、これらのレイテンシ(latency)は、Scrapy(および最終的にはサーバー)がどれだけビジー(busy)であるかの妥当な推定値を提供する必要があり、この拡張機能はその前提に基づいています。

設定

AutoThrottle拡張機能の制御に使用される設定は次のとおりです:

詳細については 仕組み を参照してください。

AUTOTHROTTLE_ENABLED

デフォルト: False

AutoThrottle拡張機能を有効にします。

AUTOTHROTTLE_START_DELAY

デフォルト: 5.0

初期ダウンロード遅延(秒単位)。

AUTOTHROTTLE_MAX_DELAY

デフォルト: 60.0

待ち時間が長い場合に設定される最大ダウンロード遅延(秒単位)。

AUTOTHROTTLE_TARGET_CONCURRENCY

デフォルト: 1.0

ScrapyがリモートWebサイトに並列して送信するリクエストの平均数。

デフォルトでは、AutoThrottleは遅延を調整して、各リモートWebサイトに単一の同時リクエストを送信します。 このオプションをより高い値(例: 2.0 )に設定すると、リモート・サーバーのスループットと負荷が増加します。 AUTOTHROTTLE_TARGET_CONCURRENCY の値(例: 0.5 )が低いと、クローラーはより保守的で礼儀正しくなります。

AutoThrottle拡張機能が有効になっている場合、 CONCURRENT_REQUESTS_PER_DOMAIN および CONCURRENT_REQUESTS_PER_IP オプションは引き続き尊重されることに注意してください。つまり、 AUTOTHROTTLE_TARGET_CONCURRENCYCONCURRENT_REQUESTS_PER_DOMAIN または CONCURRENT_REQUESTS_PER_IP よりも高い値に設定されている場合、クローラーはこの同時リクエスト数に到達しません。

指定されたすべての時点で、Scrapyは AUTOTHROTTLE_TARGET_CONCURRENCY よりも多いまたは少ない同時リクエストを送信できます。クローラーが接近しようとする推奨値であり、ハードリミットではありません。

AUTOTHROTTLE_DEBUG

デフォルト: False

AutoThrottleデバッグモードを有効にすると、受信したすべてのレスポンスの統計が表示されるため、スロットル・パラメーターがリアルタイムでどのように調整されているかを確認できます。