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.ok が True であれば成功を表します。4xx や 5xx であればエラーが発生したことを意味します。
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 サーバーに問題があるなど)
- プロキシ設定が間違っている
- ファイアウォールによって接続がブロックされている
- サーバーがダウンしている、または応答していない
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 系エラー (サーバーエラー)
- 500 Internal Server Error: サーバー内部でエラーが発生した
- 502 Bad Gateway: ゲートウェイまたはプロキシサーバーが不正なレスポンスを受け取った
- 503 Service Unavailable: サービスが一時的に利用できない (過負荷、メンテナンスなど)
- 504 Gateway Timeout: ゲートウェイまたはプロキシサーバーがタイムアウトした
タイムアウト (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
のサイトを紹介します。ぜひ活用ください。
[PR]
