Python Requestsの基本的な使い方とエラー・例外の処理

PythonでHTTPリクエストを送信するために、Requestsというライブラリを使用することができます。Requestsは、Pythonの標準ライブラリであるurllibライブラリと比較して、よりシンプルで使いやすいと言われています。Requestsを使用してHTTPリクエストを送信する方法について、実例とコードを含めて解説します。

Requestsとは何か

Requestsは、PythonでHTTPリクエストを送信するためのライブラリです。Requestsを使用することで、より簡単にHTTPリクエストを作成し、レスポンスを処理することができます。Requestsは、GET、POST、PUT、DELETEなどのHTTPメソッドをサポートしており、URLパラメーターやHTTPヘッダーなどのリクエストパラメーターを簡単に設定することができます。

Requestsの使い方

PythonでのRequestsの基本的な使い方について解説していきます。

環境の準備

Requestsをインストールする必要があります。以下のコマンドを使用して、pipを使用してRequestsをインストールします。環境にインストール済みの場合はスキップして下さい。

pip install requests

GETリクエストの送信

GETリクエストを送信するには、Requestsライブラリのget()メソッドを使用します。get()メソッドの引数には取得したいサイト、APIのURLを指定します。下記の例では、GoogleのトップページをGETリクエストで取得し、そのコンテンツをresponse.contentで取得しています。

import requests

response = requests.get('https://www.google.com/')
print(response.content)

POSTリクエストの送信

POSTリクエストを送信するには、Requestsライブラリのpost()メソッドを使用します。GETの際と同様にrequests.post()でも引数に取得したいサイト、APIのURLを指定します。リクエスト本文(ボディ)でAPIに渡したいパラメータがある場合は、post()の引数にjson=dataのように追加します。dataにはJSON形式でパラメターを記述します。以下は、仮想のAPI'https://example.com/api'にPOSTリクエストするコード例です。

import requests

data = {'key': 'value'}
response = requests.post('https://example.com/api', json=data)
print(response.content)

ヘッダーの設定

カスタムヘッダーを含むリクエストを送信しる際は、headersパラメーターを使用して、リクエストヘッダーにカスタムヘッダーを設定します。以下は、カスタムヘッダーを含むGETリクエストの例です。

import requests

headers = {'User-Agent': 'Mozilla/5.0'}
response = requests.get('https://example.com/', headers=headers)
print(response.content)

(補足)headersパラメータで指定できる主なヘッダーの種類

  • Content-Type: Content-Typeヘッダーは、リクエストまたはレスポンスの本文のデータ形式を指定します。例えば、JSONデータを送信する場合は'application/json'と指定します。
  • User-Agent: User-Agentヘッダーは、クライアント(ブラウザやアプリケーション)の情報をサーバーに伝えます。一部のWebサイトは特定のUser-Agentを要求することがあります。
  • Authorization: Authorizationヘッダーは、認証トークンやAPIキーを含めてリクエストを送信する際に使用されます。
  • その他のカスタムヘッダー: サーバーが要求する特定のヘッダーを指定することもできます。例えば、言語設定などがあります。

headersパラメーターは

headers = {"content-type": "application/json", "User-Agent": "MyApp/1.0"}

の様にカンマ区切りで同時に複数指定することが可能です。

URLパラメーターの設定

Requestsを使用してリクエストを送信するときに、URLパラメーターを設定することができます。URLパラメーターを設定する際はparamsパラメーターを使用して、URLの末尾にクエリストリング形式でパラメーターを追加しています。以下は、URLパラメーターを含むGETリクエストの例です。

import requests

params = {'key1': 'value1', 'key2': 'value2'}
response = requests.get('https://example.com/', params=params)
print(response.content)

変数paramsJSON形式で指定した内容がクエリストリング形式パラメーターに追加されます。この実装で実際にクエリさせるURLはhttps://example.com/?key1=value1&key2=value2となります。

ステータスコードの確認

リクエストが成功しているかどうか、ステータスコードを表示して確認することができます。下記のコードのようにresponse.status_codeの内容を表示して確認します。404などのステータスエラーが発生した場合などのハンドリングについては、後述の「Requestsでのエラー、例外処理」のセクションを参照して下さい。

import requests

response = requests.get('https://example.com/nonexistent-page')
print(response.status_code) 

Requestsでのエラー、例外処理

Requestsの利用におけるエラー、例外には大きく「コネクションエラー」「HTTPエラー(ステータスエラー)」「タイムアウト」があります。以下にそれぞれの処理方法を解説していきます。

コネクションエラー(requests.exceptions.ConnectionError)

requests.exceptions.ConnectionError: [Errno -2] Name or service not known

実行時にこのようなエラーが発生する場合があります。このエラーは、指定したURLにアクセスできないことを示しています。これは、URLのタイプミスや、インターネット接続の問題が原因で発生することがあります。コードないで指定したURLが正しいことを確認して下さい。また、インターネット接続が正常であることを確認して下さい。特に企業のネットワーク環境ではファイヤーウォールやプロキシ、PCのウイルス対策ソフトの設定によりサイトやAPIへのアクセスが制限されている可能性がありますので管理者に確認して下さい。

例えば、下記のようにURLにタイプミス(誤: htttps)がある場合ConnectionErrorが発生しますので、正しいURL(正: https)に修正して下さい。

import requests

url = 'htttps://example.com' #URLに誤りがある
response = requests.get(url)

また、複数のリクエストを続けて実施する際は途中で処理が中断しないように、あらかじめ例外として処理しておくことをお勧めします。

import requests

url = 'https://example.com'

try:
    response = response = requests.get(url)
except requests.exceptions.ConnectionError:
    print("コネクションエラーが発生しました。")

HTTPエラー(requests.exceptions.HTTPError)

HTTPリクエストの失敗に備え例外の処理を行います。この場合response.raise_for_status()でHTTPエラーを確認し、HTTPエラーが発生した場合は例外を処理します。

import requests

url = 'https://httpbin.org/status/404'
response = requests.get(url)
try:
    response.raise_for_status()
    print("リクエスト成功")
except requests.exceptions.HTTPError as e:
    print(f'HTTPエラーが発生しました: {e}')

タイムアウト(requests.exceptions.Timeout)

システムの稼働環境では必ずタイムアウトのハンドリングを行うことをおすすめします。PythonのRequestsではタイムアウト時間が設定されておらず、リクエスト先に問題がある場合、いつまでも処理が終了しない状況が発生しうるためです。以下の例ではtimeoutのパラメーターを指定して、タイムアウト時間を10秒に設定しています。

import requests

url = 'https://example.com'
response = requests.get(url, timeout=10)

タイムアウト上限の設定と合わせて、下記のコードのように例外のハンドリングを実施して下さい。

import requests

url = 'https://example.com'

try:
    response = response = requests.get(url, timeout=10)
except requests.exceptions.Timeout:
    print("リクエストがタイムアウトしました。")

上記以外の何らかのエラー(requests.exceptions.RequestException)

requests.exceptions.RequestExceptionはRequestsで発生する全ての例外の基底クラスです。このエラーは、リクエストの処理中に何らかの問題が発生したことを示しています。コネクションエラー、HTTPエラーやタイムアウトエを確認後、例外処理の最後にexcept requests.exceptions.Timeout:を追加してエラーメッセージを確認したり、処理をスキップして下さい。下記のコードは、上記で紹介した全てのエラー、例外ハンドリングが含まれているので、サンプルコードとしてご利用ください。

import requests

url = 'https://example.com'

try:
    response = response = requests.get(url, timeout=10)
    # ステータスコードが200 OKでない場合は例外を発生させる
    response.raise_for_status()  
    print("リクエスト成功")
except requests.exceptions.ConnectionError:
    print("コネクションエラーが発生しました。")
except requests.exceptions.HTTPError as e:
    print(f'HTTPエラーが発生しました: {e}')
except requests.exceptions.Timeout:
    print("リクエストがタイムアウトしました。")
except requests.exceptions.RequestException as e:
    print(f"エラーが発生しました: {e}")

まとめ

以上が、Requestsを使用してHTTPリクエストを送信する方法についての解説です。Requestsは、PythonでHTTPリクエストを送信するためのシンプルで使いやすいライブラリであり、HTTPリクエストの作成やレスポンスの処理を簡単に行うことができます。

最後にPythonの学習に利用できるUdemy iconのサイトを紹介します。ぜひ活用ください。

[PR]

click.linksynergy.com

click.linksynergy.com

click.linksynergy.com

click.linksynergy.com

click.linksynergy.com

click.linksynergy.com