PythonによるWebスクレイピングは、膨大なデータを効率的に収集するための強力な技術です。
しかし、プログラムによる機械的なアクセスは、対象となるWebサーバーに対して過度な負荷をかける可能性があります。
スクレイピングを行う際、適切に「待機時間」を設けることは、エンジニアとしてのマナーであると同時に、サイト運営者からのブロックを避けるための必須の対策です。
本記事では、Beautiful Soupを用いたスクレイピングにおいて、time.sleepを利用する重要性とその実装方法について解説します。
スクレイピングで待機処理が必要な理由
Webスクレイピングにおいて、待機処理を入れずに連続してリクエストを送る行為は、非常にリスクが高い行為です。
Webサーバーへの負荷軽減
人間がブラウザでページを閲覧する場合、通常は1ページを読むのに数秒から数十秒の時間を要します。
一方で、プログラムは1秒間に数百回以上のリクエストを送信することが可能であり、これはサーバーにとって攻撃を受けているのと同等の状態になります。
サーバーのリソースを枯渇させないために、アクセス間隔を空けることは最低限のルールとされています。
IPアドレスのBAN(アクセス禁止)を防ぐ
多くのWebサイトでは、短時間に大量のアクセスを行う特定のIPアドレスを自動的に検知して遮断する仕組みを導入しています。
一度IPアドレスがブロックされると、そのサイトへのアクセスが一切できなくなるだけでなく、解除までに長い時間を要することもあります。
スクレイピングの継続性を確保するためには、人間らしいアクセス頻度を模倣することが重要です。
法的・倫理的リスクの回避
過去には、過度なアクセスによってWebサイトの業務を妨害したとして、偽計業務妨害罪などの容疑で逮捕者が出た事例も存在します。
岡崎市立中央図書館事件などは、スクレイピングを行う開発者にとって常に意識すべき教訓となっています。
自身の身を守り、サイト運営者と共存するためにも、待機処理は絶対に省略してはいけません。
Pythonでの基本的な待機処理の実装
Pythonで最もシンプルかつ確実に待機処理を行う方法は、標準ライブラリのtimeモジュールを使用することです。
time.sleepの基本的な使い方
time.sleep()関数は、引数に指定した秒数だけプログラムの実行を一時停止させます。
以下のコードは、Beautiful SoupとRequestsを組み合わせて、ループ内で待機処理を行う例です。
import requests
from bs4 import BeautifulSoup
import time
# 取得したいURLのリスト
urls = [
"https://example.com/page1",
"https://example.com/page2",
"https://example.com/page3"
]
for url in urls:
# ページを取得
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
# タイトルを表示
print(soup.title.string)
# 3秒間待機する
time.sleep(3)
Example Domain - Page 1
Example Domain - Page 2
Example Domain - Page 3
このコードでは、1つのリクエストが完了するたびに3秒間の休憩を挟んでいます。
これにより、サーバーへの負荷を一定以下に抑えることが可能になります。
待機処理のベストプラクティス
単に一定時間を待つだけでなく、より高度な待機戦略を採用することで、スクレイピングの安定性が向上します。
ランダムな待機時間の導入
常に「3秒ちょうど」でアクセスし続けると、サーバー側の監視システムによって「機械的なアクセス」であると判定される場合があります。
これを防ぐためには、randomモジュールを使用して待機時間に揺らぎを持たせることが効果的です。
import time
import random
# 1秒から5秒の間でランダムに待機する
wait_time = random.uniform(1.0, 5.0)
print(f"{wait_time:.2f}秒待機します...")
time.sleep(wait_time)
random.uniform(a, b)を使うことで、aからbの間の浮動小数点を生成し、より人間に近い不規則な挙動を再現できます。
待機時間の目安となる基準
待機時間を何秒に設定すべきかは、対象のWebサイトの規模や性質によって異なります。
一般的に推奨される待機時間の目安を以下の表にまとめました。
| サイトの種類 | 推奨される待機時間 | 備考 |
|---|---|---|
| 一般的な個人ブログ | 3秒以上 | サーバー負荷に弱いため慎重に |
| 大手ニュースサイト | 1〜2秒以上 | 比較的負荷に強いがブロックも厳しい |
| 政府・公的機関 | 5秒以上 | 保守的な運用が多く、厳格なルールが必要 |
| API公開サイト | APIの規定に従う | レートリミットが明示されている場合が多い |
robots.txtの確認
待機時間を決める前に、サイトのルートディレクトリにあるrobots.txtを確認してください。
Crawl-delayという項目が指定されている場合、その秒数以上の待機を設けることが、サイト運営者からの公式なリクエストとなります。
Beautiful Soupと組み合わせて使う際の注意点
Beautiful Soup自体はHTMLを解析するライブラリであり、通信機能を持っていない点に注意が必要です。
待機を置くべき場所
待機処理を入れるタイミングは、Beautiful Soupによる解析処理の前ではなく、requests.get()などの通信を行う直前または直後です。
解析処理(パース)自体はローカルのCPUリソースを消費するだけなので、サーバーに負荷はかかりません。
例外処理と待機の組み合わせ
リクエストに失敗した場合に、即座に再試行(リトライ)を行うのは避けるべきです。
エラーが発生した際こそ、ネットワークやサーバーに問題が生じている可能性があるため、通常よりも長い待機時間を設けるのが理想的です。
import requests
import time
url = "https://example.com"
for i in range(3): # 最大3回リトライ
try:
response = requests.get(url, timeout=10)
response.raise_for_status()
break
except requests.exceptions.RequestException as e:
print(f"エラー発生: {e}")
# 失敗時は10秒待ってからリトライ
time.sleep(10)
このようにリトライ間隔を長く設定することで、サーバーの回復を待つ余裕を持たせることができます。
最新のスクレイピングにおける待機の考え方
2026年現在のWebサイトは、高度なセキュリティ対策が一般的になっています。
ヘッドレスブラウザとの違い
Beautiful Soupは静的なHTMLの解析に優れていますが、JavaScriptを多用するサイトではSeleniumやPlaywrightなどのブラウザ自動化ツールが使われます。
これらのツールでは、time.sleep以外にも「要素が表示されるまで待つ」といった動的な待機(Explicit Wait)が利用可能です。
しかし、どのツールを使うにしても、サーバーに対する物理的なリクエスト頻度を制御するという意味では、根本的な考え方は同じです。
User-Agentの設定と併用する
待機処理と合わせて、適切なUser-Agentをヘッダーに設定することもブロック対策には不可欠です。
デフォルトのPythonのUser-Agent(python-requests/2.x.x)のままでは、即座に自動プログラムだと判別されてしまいます。
最新のブラウザの文字列を模倣しつつ、待機時間を設けることで、より安全なスクレイピングが可能になります。
まとめ
Pythonでスクレイピングを行う際、time.sleepによる待機処理は、単なる技術的なテクニックではなく、Webの世界における礼儀です。
適切な待機時間を設けることで、サーバー負荷を軽減し、IPブロックのリスクを最小限に抑えることができます。
固定の秒数だけでなく、ランダムな待機時間やrobots.txtの確認を組み合わせるのがベストプラクティスです。
マナーを守った健全なスクレイピングを行い、効率的なデータ収集を実現しましょう。
