web-dev-qa-db-ja.com

スクレイピーで各リクエスト間の遅延を与える方法は?

同時にクロールしてブロックされたくありません。 1秒間に1つのリクエストを送信したいと思います。

42
nizam.sp

そのための 設定 があります。

DOWNLOAD_DELAY

デフォルト: 0

ダウンローダーが同じWebサイトから連続したページをダウンロードするまで待機する時間(秒)。これを使用してクロール速度を調整し、サーバーへの過度のアクセスを回避できます。

DOWNLOAD_DELAY = 0.25    # 250 ms of delay

ドキュメントを読む: https://doc.scrapy.org/en/latest/index.html

58
warvariuc

グローバルなダウンロード遅延を望まない場合は、スパイダーに「download_delay」属性を設定することもできます。 http://doc.scrapy.org/en/latest/faq.html#what-does-the-response-status-code-999-means を参照してください

18
Mikhail Korobov
class S(Spider):
    rate = 1

    def __init__(self):
        self.download_delay = 1/float(self.rate)

rateは、1秒間にダウンロードできるページの最大量を設定します。

8
Yan.Zero

ちょうど1秒のダウンロード遅延を維持する場合は、DOWNLOAD_DELAY=1はそれを行う方法です。

ただし、scrapyにはAutoThrottleと呼ばれるダウンロード遅延を自動的に設定する機能もあります。 ScrapyサーバーとクロールするWebサイトの両方の負荷に基づいて、遅延を自動的に設定します。これは、任意の遅延を設定するよりも効果的です。

詳細については http://doc.scrapy.org/en/1.0/topics/autothrottle.html#autothrottle-extension をご覧ください。
100個を超えるドメインをクロールしましたが、AutoThrottleをオンにしてブロックされていません

5
Jeff P Chacko

DOWNLOAD_DELAYの他に、scrapyのAUTOTHROTTLE機能を使用することもできます https://doc.scrapy.org/en/latest/topics/autothrottle.html

設定ファイルに応じてリクエスト間の遅延量を変更します。開始遅延と最大遅延の両方に1を設定すると、各リクエストで1秒待機します。

元々の目的は、ボットの検出が難しくなるように遅延時間を変えることです。

次のようにsettings.pyで設定するだけです:

AUTOTHROTTLE_ENABLED = True
AUTOTHROTTLE_START_DELAY = 1
AUTOTHROTTLE_MAX_DELAY = 3
5
Mehmet Kurtipek

遅延2に設定できますか?-

クローラーの実行中に遅延を指定できます。例えば。スクレイピークロールサンプル--set DOWNLOAD_DELAY = 3(2つのリクエスト間の遅延が3秒であることを意味します)

または、settings.pyでGlobalyを指定できますDOWNLOAD_DELAY = 3

デフォルトでは、scrapyは2つのリクエスト間で0.25秒の遅延がかかります。

5
Niranjan Sagar