158 スクレイピングにおける例外処理の基本 #自分のための備忘録
ウェブスクレイピングを行っていると、一時的なエラーやデータの取得失敗が発生することがあります。たとえば、インターネット接続が不安定だったり、サーバーが一時的に応答しなかったりすることが原因です。
こういった場合、再試行(リトライ)の仕組みを組み込むことで、成功率を上げることができます。
自分のための備忘録ですが、あなたの学習のお役にも立てれば幸いです。
ここでは、Pythonを使った簡単な再試行の方法を紹介します。
1. 基本的な再試行の考え方
スクレイピングが失敗した場合は、少し待ってから再度試すことで問題が解決することがあります。
これを自動的に行うために、ループと例外処理を組み合わせます。
2. Pythonでの再試行コード例
例:再試行を3回まで行う場合
import requests
import time
# 取得したいURL
url = 'https://example.com'
# 最大3回まで再試行する
max_retries = 3
for attempt in range(max_retries):
try:
# スクレイピングのリクエストを送る
response = requests.get(url, timeout=5)
response.raise_for_status() # HTTPエラーが発生した場合に例外を送出
# 成功したらデータを処理
print("データ取得成功:", response.text[:100]) # 最初の100文字だけ表示
break # 成功したらループを抜ける
except requests.exceptions.RequestException as e:
print(f"エラー発生: {e}")
if attempt < max_retries - 1: # 最後の試行でなければ再試行
wait_time = (attempt + 1) * 2 # 再試行する前に待機(2秒, 4秒, 6秒)
print(f"{wait_time}秒後に再試行します...")
time.sleep(wait_time)
else:
print("全ての再試行が失敗しました")
コードの説明
forループを使って、最大3回まで再試行します。
requests.get() を使ってURLからデータを取得します。
response.raise_for_status() を使って、サーバーエラー(404, 500など)を検出します。
例外が発生した場合は、2秒ずつ増やしながら待機してから再試行します。
3. 再試行のためのライブラリ:tenacityの利用
もっと柔軟に再試行したい場合は、Pythonのtenacityというライブラリを使う方法もあります。
例:tenacityを使った再試行
from tenacity import retry, wait_fixed, stop_after_attempt
import requests
@retry(wait=wait_fixed(2), stop=stop_after_attempt(3))
def fetch_data():
response = requests.get('https://example.com')
response.raise_for_status()
return response.text
try:
data = fetch_data()
print("データ取得成功:", data[:100])
except Exception as e:
print("データの取得に失敗しました:", e)
コードの説明
@retryデコレーターを使うことで、再試行の処理を簡単に追加できます。
wait_fixed(2) は、再試行する前に毎回2秒待機する設定です。
stop_after_attempt(3) は、最大3回まで再試行する設定です。
4. 再試行が必要な理由
ネットワークの不安定さ: インターネット接続が一時的に不安定になることがあります。
サーバーの負荷: サイトのサーバーが一時的に応答しないことがあります(例:アクセスが集中している場合)。
ウェブサイトの制限: サイトが自動アクセスをブロックするため、一時的に応答を遅らせることがあります。
5. ポイントまとめ
例外処理(try / except)を使ってエラーをキャッチする。
再試行の回数と待機時間を設定して、効率的にスクレイピングを行う。
必要に応じて、再試行ライブラリ(tenacity など)を活用してコードをシンプルにする。
これらの方法を使うと、スクレイピングが失敗した場合でも自動的に再試行してデータを取得できる可能性が高まります。ぜひ試してみてください! 😊