PythonでWebページを取得できたかどうかのエラーチェックと安全な中止の仕方


みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

プログラミング初心者&Windowsユーザー向けにPythonでWebスクレイピングをする方法についてお伝えしています。

前回の記事はコチラ。

Pythonでスクレイピングをする最初の一歩、Webページを丸ごと取得する方法
Windowsを使う初心者向けにPythonの情報を提供しています。今回は、Pythonでスクレイピングをする最初の一歩、requestsモジュールのget関数でWebページを丸ごと取得する方法です。

最初の一歩ということで、特定のWebページのHTMLを丸ごと取得する方法についてお伝えしました。

では、さっそくHTMLの解析だ!欲しいデータの抽出だ!!

と行きたいところなのですが、ちょっと待ってください。

ほら、スクレイピングって、サーバー調子悪かったり、URL間違えてたりすると取得できないんです。

そんなときどうなっちゃうんですかね?

ということで、PythonでHTTPリクエストする際のエラーのチェックと安全な中止の仕方についてお伝えします。

スポンサーリンク

前回のおさらいと今回のお題

前回作成したスクリプトはコチラ。

import requests
res = requests.get('https://tonari-it.com';)
print(res.text)

requestsモジュールを使って、指定したURLにGETリクエストをして、そのWebページのHTMLを取得して表示、というスクリプトでした。

簡単ですね。

通信ができないときに実行してみる

ただ…Webスクレイピングはスクリプトが正しければちゃんと動くというわけではありません。

  • 接続先のサーバーが調子悪い
  • そもそもURLが間違えている

などの理由から、うまく取得ができないときがあります。

そんな時はどうなっちゃうでしょうか。

実際に、存在しないURL「https://tonari-it.com/not_exists」宛に実行してみましょうか。

pythonで取得した404ページのHTML

…おや、取得できちゃいました。

ですが、ちょっと眺めると

お探しのページは見つかりませんでした |  Not_Exists

などとあります。実際に、ブラウザでこのURLを見てみると、いわゆる404ページでした。

いつも隣に404ページ

ということで、なんか動くけど、正しい結果が得られていなかったというややこしい感じになっちゃいますね。

レスポンスのエラーをチェックして安全に中止する

それで、基本方針としては、どうせスクリプトが正しく動かないなら、より安全に中止させよう!というアイデアで進めていきます。というか、それが推奨されています。

というのも、きっとどこかで変な挙動になるのですが、それを起こすより前に、うまくいかなかったのを検知してそこで止めちゃったほうが、安全だし、対応すべきパターンが絞られるので対処もしやすいということになります。

HTTPステータスコードとは

まず、GETリスクエストに対して正しいレスポンスが得られたかどうか、というのはHTTPステータスコードなるもので確認をすることができます。

HTTPステータスコードというのは、通信をしている際の状態を表す3桁の数字で、大まかに以下のように分類されます。

  • 100番台:処理中
  • 200番台:成功
  • 300番台:リダイレクト
  • 400番台:クライアントエラー
  • 500番台:サーバーエラー

requestsモジュールでget関数を使ったときにHTTPステータスコードを知るには、Responseオブジェクトのstatus_code属性を調べるという方法があります。

Responseオブジェクト.status_code

これで取得できます。

実際に、先ほどの存在しないページを使って、以下のようなスクリプトを実行してみると

import requests
res = requests.get('https://tonari-it.com/not_exists/')
print(res.status_code)

こんな出力が得られます。

PythonでResponseオブジェクトのstatus_codeを取得

404。そのまんまですね。

raise_for_statusメソッドで例外を発生

このステータスコードが200番台以外であれば、止めちゃえ!ということになります。

Responseオブジェクトのstatus_code属性をif文などで判定して…という手もありますが、もっと簡単な方法が用意されています。

それが、Responseオブジェクトのraise_for_statusメソッドです。

Responseオブジェクト.raise_for_status()

Responseオブジェクトが持つステータスコードが200番台以外だったら、例外を起こす、つまりエラーメッセージを吐き出してスクリプトを停止します。

実際にやってみましょう。こちらのスクリプトです。

import requests
res = requests.get('https://tonari-it.com/not_exists/')
res.raise_for_status()
print(res.text)

実行結果はコチラ。

PythonでResponseオブジェクトのraise_for_statusメソッドで例外が発生

requests.exceptions.HTTPError: 404 Client Error: Not Found for url: https://tonari-it.com/not_exists/

エラーが出て止まっちゃいますが、これでOK。

しかも、エラーメッセージがとっても親切。

まとめ

以上、PythonでWebページを取得できたかチェックする方法、またエラーの際に安全にスクリプトを中止する方法についてお伝えしました。

  • HTTPステータスコードとResponseオブジェクトのstatus_code属性について
  • Responseオブジェクトのraise_for_statusメソッドで例外を発生させる

本当は例外の発生をtry/except文でキャッチして分岐して…としたいところですが、それはまた別の機会にお伝えできればと思います。

次回は、いよいよHTMLの解析を進めていきます。

Pythonで取得したWebページのHTMLを解析するはじめの一歩
初心者かつWindowsユーザー向けにPythonでWebスクレイピングをする方法についてお伝えしています。今回はPythonでWebページのHTMLを解析するはじめの一歩、Beautiful Soupモジュールの使い方です。

どうぞお楽しみに!

連載目次:初心者向け!PythonでWebスクレイピングをしよう

スクレイピングとはWebサイトから情報を集めてくること。Pythonは専用の書籍が出るくらいスクレイピングが得意です。本シリーズでは、PythonでWebスクレイピングをする方法をお伝えしていきます。

  1. Pythonでスクレイピングをする最初の一歩、Webページを丸ごと取得する方法
  2. PythonでWebページを取得できたかどうかのエラーチェックと安全な中止の仕方
  3. Pythonで取得したWebページのHTMLを解析するはじめの一歩
  4. PythonでWebページ内の特定のタグ要素をまとめて取得する
  5. PythonでWebページから特定のclass属性を持つ要素をまとめて取得する方法
  6. PythonでWebページからid属性を条件にして要素を取得する方法
  7. PythonでWebページのHTML要素からテキストやリンクURLを取得する方法

タイトルとURLをコピーしました