今回は、Pythonのrequestsライブラリでタイムアウトを設定する方法についてご紹介します。
PythonでHTTP通信を行う際に便利なrequestsライブラリは、シンプルな構文でさまざまなリクエストを送信できます。
しかし、通信環境や対象サーバの応答速度によっては処理が長引く場合があるため、timeoutを適切に設定しておくことが重要です。
ここでは、timeout引数の基本から実用的なコード例、エラー処理や注意点などを解説します。
requestsライブラリとは
requestsライブラリは、Pythonの標準ライブラリであるurllibよりも簡潔な構文でHTTPリクエストを扱えるライブラリです。
GET、POSTなどの各種HTTPメソッドを直感的に使用でき、エラーハンドリングも充実しています。
pipなどのパッケージ管理ツールでインストールし、import requestsして利用します。
タイムアウト設定の基本
timeoutとは、指定した時間内に応答が得られない場合に例外を発生させる仕組みです。
timeout引数を活用すると、ネットワーク障害時のハングやレスポンス遅延によるリソースの無駄を抑制できます。
単一のタイムアウト値
以下のように、requests.get()やrequests.post()などのメソッドにtimeoutを指定するだけで簡単にタイムアウトを設定できます。
1 2 3 4 5 6 7 8 |
import requests try: # 5秒以内に応答がない場合はTimeout例外を発生させる response = requests.get("https://example.com", timeout=5) print(response.status_code) except requests.exceptions.Timeout: print("タイムアウトが発生しました。") |
単一の数値を指定すると、接続タイムアウト(connect timeout)と読み込みタイムアウト(read timeout)両方に同じ秒数が適用されます。
タプルでのタイムアウト指定
より柔軟に設定する場合は、timeout=(接続タイムアウト, 読み込みタイムアウト)の形式を利用します。
次の例では、接続に3秒、レスポンス読み込みに7秒のタイムアウトを設けます。
1 2 3 4 5 6 7 |
import requests try: response = requests.get("https://example.com", timeout=(3, 7)) print(response.status_code) except requests.exceptions.Timeout: print("接続または読み込みでタイムアウトが発生しました。") |
このように別々の時間を指定できるため、ネットワーク特性やサーバの状況に合わせた調整が可能です。
具体的な使用例
ここでは、GETとPOSTリクエストの例に加え、エラーハンドリングも含めてコードを示します。
POSTリクエストでのタイムアウト設定
APIにデータを送信するケースを考えてみます。
POSTリクエストでも同様にtimeoutが利用できるため、大きなデータを送信する場合でも適度な制限を設けられます。
1 2 3 4 5 6 7 8 9 |
import requests data = {"key": "value"} try: response = requests.post("https://api.example.com/endpoint", data=data, timeout=10) print(response.json()) except requests.exceptions.Timeout: print("POSTリクエストでタイムアウトが発生しました。") |
タイムアウトが発生した場合には例外が投げられるので、適切にエラーハンドリングを行うことが大切です。
例外処理の例
タイムアウト以外にもさまざまな通信エラーが起こり得ます。
requestsは、requests.exceptions.Timeout、requests.exceptions.HTTPError、requests.exceptions.RequestExceptionなど、用途別の例外クラスを提供しているため、必要に応じてハンドリングしてください。
1 2 3 4 5 6 7 8 9 10 11 12 |
import requests try: response = requests.get("https://example.com", timeout=(3, 7)) response.raise_for_status() # HTTPステータスコードが4xx,5xxの場合は例外を発生 print(response.text) except requests.exceptions.Timeout: print("タイムアウトエラー:指定した時間内に応答がありませんでした。") except requests.exceptions.HTTPError as http_err: print(f"HTTPエラーが発生しました: {http_err}") except requests.exceptions.RequestException as err: print(f"その他のエラーが発生しました: {err}") |
なお、response.raise_for_status()を呼び出すことで、HTTPエラー(4xx,5xx)時に例外を発生させることができます。
よくあるエラーと注意点
timeoutを活用する際には、いくつか気を付けるポイントがあります。
- 設定時間を短くしすぎない
短すぎるとネットワークの一時的な遅延などで頻繁にタイムアウトが発生し、正しい通信ができなくなる可能性があります。 - 設定時間を長くしすぎない
逆に長くしすぎると、ハング状態に陥ったリクエストを延々と待ち続ける可能性が高くなります。 - 複数のエラーを想定する
タイムアウトだけでなく、DNS解決エラーやHTTPエラーなどさまざまな例外が起こり得るため、包括的な例外処理を行うことが必要です。 - リトライ機構の導入
重要な通信処理であれば、リトライを実装するためにHTTPAdapterやRetryなどを併用する方法も検討してください。
こうしたポイントを踏まえてtimeoutを設定することで、通信の安定性と効率化を図れます。
まとめ
requestsライブラリでのtimeout設定は、通信時の無駄な待機を防ぐための重要な仕組みです。
単一の値やタプルを用いて接続・読み込みタイムアウトを調整し、各種例外を適切にハンドリングすることで、安定した通信処理が行えます。
ぜひ活用して、安全かつ効率的なHTTPリクエストを実装してください。