以下の内容はhttps://pydocument.hatenablog.com/entry/2023/03/25/235355より取得しました。


Python Requestsの基本的な使い方とエラーの原因、エラーハンドリング

Python で HTTP リクエストを送信する際、Requests ライブラリは非常に便利です。標準ライブラリの urllib よりもシンプルで直感的に扱えるため、多くの開発者に利用されています。この記事では、Requests を使用した HTTP リクエストの送信方法について、具体的なコード例を交えながら解説します。

Requests とは

Requests は、Python で HTTP 通信を行うためのライブラリです。GET、POST、PUT、DELETE など、様々な HTTP メソッドに対応しており、URL パラメータ、ヘッダー、リクエストボディなどの設定も簡単に行えます。

Requests の基本的な使い方

環境準備

まず、Requests をインストールします。まだインストールしていない場合は、以下のコマンドでインストールしてください。

pip install requests

GET リクエストの送信

GET リクエストを送信するには、requests.get() メソッドを使用します。引数には、取得したいリソースの URL を指定します。

import requests

response = requests.get('[https://www.google.com/](https://www.google.com/)')
print(response.content)  # レスポンスボディをバイト形式で取得
print(response.text)     # レスポンスボディをテキスト形式で取得
# print(response.json())   # レスポンスボディをJSON形式で取得 (JSONの場合)

response.contentでレスポンスの内容をバイト形式で取得できます。response.textでテキスト形式、response.json()JSON形式で取得することも可能です。

POST リクエストの送信

POST リクエストを送信するには、requests.post() メソッドを使用します。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](https://example.com/api)', json=data)
print(response.content)

ヘッダーの設定

リクエストヘッダーをカスタマイズするには、headers パラメータを使用します。

import requests

headers = {'User-Agent': 'My Custom User-Agent'}
response = requests.get('[https://example.com/](https://example.com/)', headers=headers)
print(response.content)

headers パラメータで指定できる主なヘッダー

  • Content-Type: リクエスト/レスポンスのボディのデータ形式を指定します (例: application/json, text/html)。
  • User-Agent: クライアント (ブラウザやアプリケーション) の情報をサーバーに伝えます。
  • Authorization: 認証情報 (API キー) を含める際に使用します。
  • その他カスタムヘッダー: サーバーが要求する特定のヘッダー (例: 言語設定、キャッシュ制御) を指定できます。

headers パラメータは、以下のように複数のヘッダーを同時に指定することも可能です。

headers = {"Content-Type": "application/json", "User-Agent": "MyApp/1.0"}

URL パラメータの設定

URL パラメータ (クエリ文字列) を設定するには、params パラメータを使用します。

import requests

params = {'key1': 'value1', 'key2': 'value2'}
response = requests.get('[https://example.com/](https://example.com/)', params=params)
print(response.url) # 生成された URL を確認
print(response.content)

このコードは、https://example.com/?key1=value1&key2=value2 という URL に対して GET リクエストを送信します。

ステータスコードの確認

HTTP リクエストの結果は、ステータスコードで確認できます。response.status_codeステータスコードを取得できます。ステータスコード200 (OK) であればリクエストは成功、response.okTrue であれば成功を表します。4xx5xx であればエラーが発生したことを意味します。

import requests

response = requests.get('[https://example.com/nonexistent-page](https://example.com/nonexistent-page)')
print(response.status_code)  # 404 (Not Found) などが表示される

Requests でのエラー、例外処理

Requests を使用する際は、様々なエラーや例外が発生する可能性があります。適切にエラーハンドリングを行うことで、プログラムの堅牢性を高めることができます。

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

ネットワーク接続の問題や、指定した URL が存在しない場合などに発生します。

import requests

url = '[https://invalid.example.com](https://invalid.example.com)'  # 存在しないドメイン

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

よくある原因

  • ネットワーク接続が確立されていない (オフライン、WiFi が切断されているなど)
  • DNS 名前解決に失敗している (ドメイン名が存在しない、DNS サーバーに問題があるなど)
  • プロキシ設定が間違っている
  • ファイアウォールによって接続がブロックされている
  • サーバーがダウンしている、または応答していない

pydocument.hatenablog.com

HTTP エラー (requests.exceptions.HTTPError)

ステータスコードが 4xx または 5xx の場合に発生します。response.raise_for_status() メソッドを呼び出すことで、HTTP エラーを明示的に例外として発生させることができます。

import requests

url = '[https://httpbin.org/status/404](https://httpbin.org/status/404)'  # 404 を返す URL
response = requests.get(url)

try:
    response.raise_for_status()  # ステータスコードが 200 以外なら例外を発生
except requests.exceptions.HTTPError as e:
    print(f'HTTP エラーが発生しました: {e}')

よくある原因

  • 4xx 系エラー (クライアントエラー)
    • 400 Bad Request: リクエストの形式が間違っている (パラメータ不足、不正な JSON など)
    • 401 Unauthorized: 認証が必要なリソースにアクセスしようとした (認証情報がない、または間違っている)
    • 403 Forbidden: アクセスが許可されていない (権限がない)
    • 404 Not Found: リソースが存在しない
    • 405 Method Not Allowed: 指定した HTTP メソッドが許可されていない
  • 5xx 系エラー (サーバーエラー)

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

リクエストが指定した時間内に完了しない場合に発生します。timeout パラメータでタイムアウト時間を設定できます (秒単位)。

import requests

url = '[https://example.com](https://example.com)'

try:
    response = requests.get(url, timeout=0.1)  # 0.1 秒でタイムアウト
except requests.exceptions.Timeout as e:
    print(f"リクエストがタイムアウトしました: {e}")

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

よくある原因

  • ネットワークが遅い、または不安定
  • サーバーの応答が遅い (過負荷、処理に時間がかかっているなど)
  • 設定したタイムアウト時間が短すぎる

その他のエラー (requests.exceptions.RequestException)

上記以外のエラー (例えば、リダイレクト回数が多すぎる場合など) は、requests.exceptions.RequestException を捕捉することで処理できます。これは、Requests で発生するすべての例外の基底クラスです。

import requests

url = '[https://example.com](https://example.com)'

try:
    response = requests.get(url, timeout=10)
    response.raise_for_status() # HTTPError が発生した場合、ここで例外が送出される
except requests.exceptions.ConnectionError as e:
    print(f"コネクションエラーが発生しました: {e}")
except requests.exceptions.HTTPError as e:
    print(f'HTTP エラーが発生しました: {e}')
except requests.exceptions.Timeout as e:
    print(f"リクエストがタイムアウトしました: {e}")
except requests.exceptions.RequestException as e:
    print(f"その他のエラーが発生しました: {e}")
else:
    print("リクエスト成功") # 例外が発生しなかった場合 (成功時) の処理

requests.exceptions.RequestException で捕捉できるその他のエラーの例

  • requests.exceptions.TooManyRedirects: リダイレクト回数が多すぎる
  • requests.exceptions.InvalidURL: URL の形式が不正
  • requests.exceptions.MissingSchema: URL にスキーマ (http, https など) が含まれていない
  • requests.exceptions.InvalidHeader: 不正なヘッダーが指定された
  • requests.exceptions.ContentDecodingError レスポンスボディのデコードに失敗した

まとめ

Requests は、Python で HTTP リクエストを扱う際に便利なライブラリです。この記事で紹介した基本的な使い方とエラーハンドリングを参考に、ぜひ Requests を活用してみてください。Requests を使うことで、Web API の利用や Web スクレイピングなど、様々な処理を効率的に行うことができます。

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

[PR]

click.linksynergy.com

click.linksynergy.com

click.linksynergy.com

click.linksynergy.com

click.linksynergy.com

click.linksynergy.com

click.linksynergy.com

APIデザイン・パターン (Compass Booksシリーズ) [ JJ Geewax ]




以上の内容はhttps://pydocument.hatenablog.com/entry/2023/03/25/235355より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14