ログアウト中 ログイン

【Python】BeautifulSoup版スクレイピングツール開発講座 第4章4.1節「例外処理機能の作成」




現在の見出し:4.1節:例外処理機能の作成

見出し一覧

  • 4.1節:例外処理機能の作成
  • - try-except文によるHTTP接続エラー処理機能の実装
  • - status_code属性による通信状態確認機能の追加

【PR】『Python』を学べる企業・個人向けのプログラミングコース

try-except文によるHTTP接続エラー処理機能の実装

前節(第3章 3.2節)で作成したコードを基盤として、try-except文によるHTTP接続エラー処理機能を追加します。現在のプログラムプログラムはコンピュータに対して何をすべきかを指示する一連の命令です。では、無効なURLや接続エラーが発生した場合にプログラムが異常終了してしまうため、適切なエラーハンドリングが必要です。

try-except文を使用することで、requests.get()関数関数は一定の処理をまとめたプログラムの塊です。で発生する可能性がある例外例外は予期せぬエラーが発生した場合に通常の処理を中断して別の処理を行う仕組みです。を捕捉して適切に処理できます。requests.exceptions.RequestExceptionは、HTTP関連のすべてのエラーを包括的に捕捉する例外クラスです。この例外処理例外処理はプログラム実行中に発生する予期せぬエラーや異常な状況に対処するための仕組みで、プログラムの安定性と信頼性を向上させます。により、ネットワークネットワークはコンピューターやスマートフォンなどの機器が互いに通信し合うための仕組みや手段です。エラーやDNS解決エラー、タイムアウトなどの様々な接続問題に対応できます。

エラータイプ 発生原因 従来の動作 改善後の動作
ConnectionError ネットワーク接続失敗 プログラム異常終了 エラーメッセージ表示後継続
Timeout 接続タイムアウト プログラム異常終了 エラーメッセージ表示後継続
InvalidURL 無効なURL形式 プログラム異常終了 エラーメッセージ表示後継続

また、エラー発生時の処理フローも重要な考慮点です。continuecontinue文は、ループ処理で特定条件時に現在の繰り返しをスキップして次の繰り返しに進む制御文で、多くの言語でサポートされています。文を使用することで、エラーが発生してもプログラムを終了させず次のURL入力に進めます。この設計によって1つのURLでエラーが発生しても、別のURLで処理を継続できるスクレイピングツールになります。

# コード
import requests
from bs4 import BeautifulSoup
import csv

# 継続実行機能
while True:
    # URL取得機能
    user_url = input("スクレイピングするURLを入力してください: ")
    print(f"入力されたURL: {user_url}")

    # HTTP接続エラー処理機能を追加
    try:
        # HTMLデータを取得
        response = requests.get(user_url)
        print("HTMLデータ取得完了")
        print(f"データサイズ: {len(response.text)}文字")

        # HTML解析機能
        soup = BeautifulSoup(response.text, 'html.parser')
        print("HTML解析完了")
        print(f"解析結果タイプ: {type(soup)}")

        # 特定タグ抽出機能
        title_element = soup.find('title')
        print("タイトルタグ抽出完了")
        print(f"抽出要素: {title_element}")

        # 文字データ取得機能
        if title_element:
            title_text = title_element.text
            print("文字データ取得完了")
            print(f"タイトル: {title_text}")
        else:
            print("タイトルタグが見つかりません")
            title_text = "タイトル不明"

        # 複数要素抽出機能
        h2_elements = soup.find_all('h2')
        print(f"h2タグ抽出完了: {len(h2_elements)}個")

        # 繰り返し処理機能
        file = open("scraped_data.csv", 'a', newline='', encoding='utf-8')
        writer = csv.writer(file)
        
        for element in h2_elements:
            h2_text = element.text.strip()
            writer.writerow([h2_text, user_url])
            
        file.close()
        print("複数データ保存完了")
        
    except requests.exceptions.RequestException as e:
        print(f"接続エラーが発生しました: {e}")
        print("別のURLを試してください")
        continue
    
    # 処理分岐機能
    choice = input("続けますか? (y/n/q): ")
    
    if choice.lower() == 'y':
        print("次のURLを入力してください")
        continue
    elif choice.lower() == 'n':
        print("一時停止します")
        continue
    else:
        print("プログラムを終了します")
        break

# 終了処理
print("スクレイピングツールを終了しました")
# 実行結果
スクレイピングするURLを入力してください: https://invalid-url-example.com
入力されたURL: https://invalid-url-example.com
接続エラーが発生しました: HTTPSConnectionPool(host='invalid-url-example.com', port=443): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x000001>: Failed to establish a new connection: [Errno11001] getaddrinfo failed'))
別のURLを試してください
スクレイピングするURLを入力してください: https://codecamp.jp/
入力されたURL: https://codecamp.jp/
HTMLデータ取得完了
データサイズ: 62329文字
HTML解析完了
解析結果タイプ: <class 'bs4.BeautifulSoup'>
タイトルタグ抽出完了
抽出要素: <title>DX人材育成ならCodeCamp(コードキャンプ)</title>
文字データ取得完了
タイトル: DX人材育成ならCodeCamp(コードキャンプ)
h2タグ抽出完了: 6個
複数データ保存完了
続けますか? (y/n/q): q
プログラムを終了します
スクレイピングツールを終了しました
行数 種別 コード 解説
13行目 新規 try: 例外が発生する可能性のあるHTTP通信処理を含むコードブロックを開始します。try文により、エラーが発生してもプログラムが異常終了しないようにします。
15行目 変更 response = requests.get(user_url) 前節のコードをtry文内に移動してインデントインデントはコード内の行頭をスペースやタブでずらすことです。を追加します。HTTP通信エラーの捕捉対象となる処理です。
53行目 新規 except requests.exceptions.RequestException as e: HTTP関連のすべての例外を捕捉します。接続エラー、タイムアウト、DNS解決エラーなど様々なネットワーク問題に対応します。
54行目 新規 print(f"接続エラーが発生しました: {e}") 発生した具体的なエラー内容をユーザーに表示します。エラーの詳細情報により、問題の特定と対処が可能になります。
55行目 新規 print("別のURLを試してください") エラー発生時の対処方法をユーザーに明確に指示します。次の動作を示すことで、ユーザーが適切に対応できるようにします。
56行目 新規 continue エラー発生時にwhile文の先頭に戻ってURL入力から再開します。プログラムを終了させずに別のURLでの処理継続を可能にします。
status_code属性による通信状態確認機能の追加

第4章4.1節「status_code属性による通信状態確認機能の追加」の続きを見る


すべてのカリキュラムを無料登録で学ぶ

プログラミング・マーケティング・AI活用方法を
今すぐ無料登録すると、全てのコンテンツが視聴可能になります。