現在の見出し: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での処理継続を可能にします。 |