CodeGym /コース /Python SELF JA /スクリプトの安定性向上のためのリトライとタイムアウト

スクリプトの安定性向上のためのリトライとタイムアウト

Python SELF JA
レベル 34 , レッスン 3
使用可能

1. スクリプトでのエラー処理

ウェブスクレイピングの課題

想像してください: あなたのスクリプトが準備万端、仕事に取り掛かろうとしているところで、突然バナナの皮で滑ってしまった…。エラーとクラッシュの嵐。それをどうやって乗り越えられるのか?今日は、あなたのスクリプトに2つの大事なスキルを教えます: 忍耐力と再試行力です。つまり、リトライとタイムアウトを設定します。

ウェブスクレイピングの作業は楽しいものですが、以下のような原因でスクリプトが突然停止することがあります:

  • 接続の失敗。
  • サーバーが一時的に利用できない。
  • HTML構造の予期しない変更。

あなたのスクリプトはジェダイのように予期しない事態に備え、それに対応する準備が必要です。場合によっては、少し待ってリクエストを再試行するだけで問題が解決することも。ここで登場するのが、私たちのヒーロー、リトライとタイムアウトです!

エラー処理の仕組みの紹介

まず基本に戻りましょう — Pythonでのエラー処理です。エラーを管理してスクリプトの実行を妨げないようにするために、try-exceptブロックを使います。

Python

import requests

try:
    response = requests.get('https://example.com')
    response.raise_for_status()  # リクエストの成功を確認
except requests.exceptions.RequestException as e:
    print(f'エラーが発生しました: {e}')

2. リトライの設定

なぜリトライを使うべきか?

最初の失敗で諦めてしまうスクリプトは、土砂降りの雨を恐れる猫のようなものです。しかし、あなたには困難に耐えるスクリプトが必要です。だからこそ、リトライを設定してスクリプトに自信を持たせるのです。

リトライを設定する方法

リトライを組織化する方法について見てみましょう。最も簡単な方法の1つは、urllib3ライブラリを使用することです。このライブラリは、エラー時にリクエストを自動的に再送信する機能を提供します。

Python

from urllib3.util.retry import Retry
from requests.adapters import HTTPAdapter
import requests

session = requests.Session()
retries = Retry(total=5, backoff_factor=1, status_forcelist=[500, 502, 503, 504])
session.mount('https://', HTTPAdapter(max_retries=retries))

try:
    response = session.get('https://example.com')
    response.raise_for_status()
    print(response.content)
except requests.exceptions.RequestException as e:
    print(f'エラーが発生しました: {e}')

この例では、sessionを作成し、リトライ機能(Retry)を適用しています。5回まで再試行を行うように設定し、500、502、503、504のコードで失敗した場合に再試行します。backoff_factor=1は、試行間の待機時間が指数関数的に増加することを意味します (1、2、4、8... 秒)。

3. タイムアウト: ハングアップの防止

待機時間を抑えよう

タイムアウトは目覚まし時計のようなものです: サーバーの応答待ちでハングアップしないようにします。タイムアウトを設定することで、スクリプトに「ここまで! 指定された時間内にサーバーが応答しない場合は先に進め!」と言うことができます。

Python

try:
    response = requests.get('https://example.com', timeout=10)
    response.raise_for_status()
    print(response.content)
except requests.exceptions.Timeout:
    print('リクエストがタイムアウトしました')
except requests.exceptions.RequestException as e:
    print(f'エラーが発生しました: {e}')

なぜこれが必要なのか?

サーバーの応答を待つ間、スクリプトが「止まってしまう」のを経験したことはありませんか?タイムアウトは無駄な待ち時間を防ぎ、コードが迅速に回復して作業を続行できるようにします。スクリプトに「長すぎる待機時間」がないようにしましょう!

4. 設定例

リトライを使用した堅牢なスクリプトの実装

次に、アイアンマンの鎧のごとく堅牢なスクリプトを組み立ててみましょう。タイムアウトとリトライの両方を使用します。

Python

from urllib3.util.retry import Retry
from requests.adapters import HTTPAdapter
import requests

def fetch_url(url):
    session = requests.Session()
    retries = Retry(total=5, backoff_factor=1, status_forcelist=[500, 502, 503, 504])
    session.mount('https://', HTTPAdapter(max_retries=retries))

    try:
        response = session.get(url, timeout=10)
        response.raise_for_status()
        return response.content
    except requests.exceptions.Timeout:
        print('リクエストがタイムアウトしました')
    except requests.exceptions.RequestException as e:
        print(f'エラーが発生しました: {e}')
    return None

content = fetch_url('https://example.com')
if content:
    print('データのダウンロードに成功しました!')

スクリプトのハングアップを防ぐタイムアウトの使用

タイムアウトの設定方法は既に示しました。ここで、スクリプトが合理的に長い待機時間に対応できるようにすることを確認しましょう。「待機しない」という単純明快なアプローチで、コードを信頼性の高いものにし、インターネット上で起こりうる不測の事態に備えましょう。

こうした技術的アプローチは、信頼性が高く、データの正確性と納期を保証するツールとなります。また、プロジェクトにおけるこれらの技術を使いこなすことで、あなたの履歴書への信頼性を高め、クライアントへの信頼を築くことができます。

コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION