私は最近、この同じ問題を解決しました。考慮すべきことの 1 つは、一部の人々は、サーバーが停止することを快く思わず、停止する IP アドレスをブロックするということです。私が聞いた標準的な礼儀は、ページ リクエスト間の間隔は約 3 秒ですが、これは柔軟です。
複数の Web サイトからダウンロードする場合は、URL をドメインごとにグループ化し、それぞれに 1 つのスレッドを作成できます。次に、スレッドで次のようなことができます。
for url in urls:
timer = time.time()
# ... get your content ...
# perhaps put content in a queue to be written back to
# your database if it doesn't allow concurrent writes.
while time.time() - timer < 3.0:
time.sleep(0.5)
場合によっては、応答を取得するだけで 3 秒かかることがありますが、それについて心配する必要はありません。
確かに、1 つのサイトからのみダウンロードしている場合、これはまったく役に立ちませんが、ブロックされないようにすることはできます。
私のマシンは、約 200 のスレッドを処理してから、それらを管理するオーバーヘッドによってプロセスが遅くなりました。最終的には、毎秒 40 ~ 50 ページ程度になりました。