見出し画像

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 など)を活用してコードをシンプルにする。

これらの方法を使うと、スクレイピングが失敗した場合でも自動的に再試行してデータを取得できる可能性が高まります。ぜひ試してみてください! 😊

いいなと思ったら応援しよう!