Pythonでスクレイピングのエラーハンドリングを行う方法!初心者でも安心して動かせる対策を徹底解説
生徒
「Pythonでスクレイピングしていたら、途中でエラーが出て止まってしまいました…どうすればいいですか?」
先生
「それは“エラーハンドリング”を使うと解決できます。エラーが出てもプログラムを止めずに処理できるようになります。」
生徒
「エラーを無視できるってことですか?」
先生
「無視というより、安全に対応するイメージです。エラーが起きたときにどうするかを決めておくんです。」
生徒
「なるほど!やり方を教えてください!」
先生
「では、基本から順番に見ていきましょう!」
1. エラーハンドリングとは?
エラーハンドリングとは、プログラムの実行中に発生するエラーに対して、あらかじめ対処方法を用意しておく仕組みです。 例えば、Webスクレイピングでは、ページが存在しない場合や通信が失敗する場合があります。そのままではプログラムが止まってしまいますが、 エラーハンドリングを使えば、処理を続けることができます。
2. tryとexceptの基本構文
Pythonでは、tryとexceptを使ってエラー処理を行います。
tryの中でエラーが発生した場合、exceptの処理が実行されます。
try:
print(10 / 0)
except:
print("エラーが発生しました")
このコードでは、0で割ることでエラーが発生しますが、プログラムは止まらずにメッセージが表示されます。
エラーが発生しました
3. スクレイピングでよくあるエラー
Webスクレイピングでは、さまざまなエラーが発生します。例えば、URLが間違っている場合や、 サーバーにアクセスできない場合があります。また、HTMLの構造が変わって要素が見つからない場合もあります。
import requests
try:
response = requests.get("https://example.com/invalid")
print(response.status_code)
except:
print("通信エラーが発生しました")
通信エラーが発生しても、安全に処理を続けることができます。
4. エラーの種類を指定する方法
すべてのエラーをまとめて処理するのではなく、特定のエラーだけを処理することもできます。 これにより、より正確な対応が可能になります。
try:
num = int("abc")
except ValueError:
print("数値に変換できませんでした")
この例では、文字列を数値に変換できなかった場合だけ処理が実行されます。 どのエラーが発生したのかを把握することが大切です。
5. エラー内容を表示する方法
エラーの内容を表示すると、原因を調べやすくなります。これはデバッグ(問題を見つけて修正する作業)に役立ちます。
try:
print(10 / 0)
except Exception as e:
print("エラー内容:", e)
エラー内容: division by zero
このように、エラーの詳細を確認することで、どこを直せばよいかがわかります。
6. finallyで必ず実行する処理
finallyは、エラーの有無に関係なく必ず実行される処理です。
ファイルを閉じる処理などに使われます。
try:
print("処理開始")
x = 1 / 0
except:
print("エラー発生")
finally:
print("処理終了")
処理開始
エラー発生
処理終了
必ず実行したい処理は、finallyに書くようにしましょう。
7. スクレイピングでの実践的なエラーハンドリング
実際のスクレイピングでは、ページ取得とデータ取得の両方でエラー対策が必要です。 それぞれにエラーハンドリングを入れることで、より安全なプログラムになります。
import requests
from bs4 import BeautifulSoup
try:
response = requests.get("https://example.com")
soup = BeautifulSoup(response.text, "html.parser")
try:
title = soup.find("h1").text
print(title)
except:
print("タイトルが見つかりませんでした")
except:
print("ページの取得に失敗しました")
このように、処理ごとにエラー対策をすることで、どこで問題が起きたのかが分かりやすくなります。
8. エラーハンドリングを使うメリット
エラーハンドリングを使うことで、プログラムが途中で止まるのを防げます。 また、原因の特定がしやすくなり、修正も簡単になります。 特にWebスクレイピングでは、外部サイトに依存するため、エラー対策は必須です。
初心者のうちは、まずtryとexceptを使ってエラーに慣れることが重要です。 少しずつエラーの種類を理解して、より細かい制御ができるようになりましょう。
まとめ
エラーハンドリングの重要ポイントを振り返る
PythonでのWebスクレイピングにおいて、エラーハンドリングは非常に重要な技術です。スクレイピングは外部のWebサイトからデータを取得する処理であるため、通信エラーやHTML構造の変更、存在しないページへのアクセスなど、さまざまな問題が発生する可能性があります。 そのため、エラーハンドリングを適切に実装することで、プログラムが途中で停止するのを防ぎ、安定したデータ取得を実現できます。
特に初心者の方は、「エラーが出たらプログラムが止まってしまう」という経験を何度もすると思います。しかし、tryとexceptを使うことで、エラー発生時の処理をあらかじめ決めておくことができ、安心してプログラムを動かすことができます。
スクレイピングで意識すべきエラー対策
Webスクレイピングでは、以下のようなエラーがよく発生します。
- 通信エラー(サーバーに接続できない)
- HTTPステータスエラー(404や500など)
- HTML要素が見つからないエラー
- データ変換エラー(文字列を数値に変換できないなど)
これらのエラーに対して、個別に対応できるようにしておくことで、より実践的で強いプログラムになります。また、Exceptionとしてまとめて処理するのではなく、ValueErrorやrequestsの例外など、具体的なエラーを指定することで、より精度の高いエラーハンドリングが可能になります。
実践的なサンプルプログラム
ここでは、PythonのWebスクレイピングでよく使うエラーハンドリングを組み合わせた実践的なサンプルコードを紹介します。
import requests
from bs4 import BeautifulSoup
url = "https://example.com"
try:
response = requests.get(url, timeout=5)
response.raise_for_status()
soup = BeautifulSoup(response.text, "html.parser")
try:
title = soup.find("h1").text
print("タイトル:", title)
except AttributeError:
print("タイトル要素が見つかりませんでした")
except requests.exceptions.Timeout:
print("タイムアウトが発生しました")
except requests.exceptions.RequestException as e:
print("通信エラー:", e)
finally:
print("スクレイピング処理を終了します")
このコードでは、通信エラー、タイムアウト、HTML要素の取得失敗など、複数のエラーに対応しています。また、finallyを使うことで、処理の最後に必ずメッセージを表示するようにしています。
エラーハンドリングを習得するメリット
エラーハンドリングを習得することで、プログラムの品質が大きく向上します。具体的には以下のようなメリットがあります。
- プログラムが途中で止まらなくなる
- エラー原因を特定しやすくなる
- ユーザーに分かりやすいメッセージを表示できる
- 長時間のスクレイピング処理でも安定して動作する
特にPython初心者の方にとっては、エラーは怖いものに感じるかもしれません。しかし、エラーハンドリングを正しく理解すれば、エラーは「問題を教えてくれるヒント」に変わります。積極的に活用して、より安全で信頼性の高いプログラムを作っていきましょう。
生徒
「エラーハンドリングって、最初は難しそうだと思っていましたが、意外とシンプルですね!」
先生
「そうですね。基本はtryとexceptだけです。ただし、どのエラーにどう対応するかが重要になります。」
生徒
「スクレイピングでは特にエラーが多いって聞いたので、ちゃんと対策しないといけないですね。」
先生
「その通りです。通信エラーやHTMLの変更は日常的に起こるので、エラーハンドリングは必須です。」
生徒
「あと、エラー内容を表示することで原因が分かりやすくなるのも良かったです!」
先生
「デバッグにはとても役立ちます。Exception as eの書き方はぜひ覚えておきましょう。」
生徒
「finallyも便利ですね。最後に必ず処理を実行できるのは安心です。」
先生
「はい。ログ出力や後処理にとても役立ちます。実務でもよく使われますよ。」
生徒
「これでエラーが出ても怖くなくなりました!もっと色々なケースに対応できるように練習します!」
先生
「その意気です。エラーハンドリングを使いこなせば、安定したスクレイピングプログラムが作れるようになりますよ。」