企業ネットワークなど、プロキシが設定されている環境では、Pythonから外部APIへのリクエストが失敗することがあります。この記事では、Pythonでプロキシ環境下からAPIリクエストを送信する方法を、具体的なコード例とともに解説します。Requestsライブラリとurllibライブラリの両方を使用する方法を紹介し、認証付きプロキシ、環境変数、例外処理についても説明します。
注: プロキシは、ネットワーク通信を中継し、セキュリティ強化やアクセス制御のために使用されるサーバーです。多くの企業ネットワークで採用されています。
- 1. プロキシ設定の確認
- 2. PythonでのAPIリクエスト (プロキシなしの場合)
- 3. プロキシ環境下でのAPIリクエスト (Requests使用)
- 4. 認証付きプロキシ (Requests使用)
- 5. 環境変数からプロキシ設定を読み込む (Requests)
- 6. プロキシ環境下でのAPIリクエスト (urllib使用)
- 7. まとめと注意点
1. プロキシ設定の確認
APIリスクエスト時にrequests.exceptions.ProxyErrorやurllib.error.URLErrorのようなエラーが発生した場合、プロキシの影響を確認します。まず、自身の環境でプロキシが設定されているかを確認しましょう。
- Windowsの場合
- 「設定」>「ネットワークとインターネット」>「プロキシ」で確認できます。
- コマンドプロンプトで
netsh winhttp show proxyを実行しても確認できます。
- macOS / Linuxの場合
- ターミナルで
echo $http_proxyやecho $https_proxyを実行します。プロキシが設定されていれば、URLが表示されます。
- ターミナルで
2. PythonでのAPIリクエスト (プロキシなしの場合)
Requestsライブラリを使った基本的なAPIリクエストは以下の通りです。
import requests url = 'https://api.example.com/data' try: response = requests.get(url) response.raise_for_status() # ステータスコードが200番台以外の場合、例外を発生させる print(response.json()) except requests.exceptions.RequestException as e: print(f"リクエストエラー: {e}")
requests.get(url)で指定されたURLにGETリクエストを送信します。このurlの変数部分をAPIの仕様に合わせて置き換えます。
Requestsの詳しい使い方は下記の記事で解説しています。
3. プロキシ環境下でのAPIリクエスト (Requests使用)
プロキシ環境下では、requests.get()のproxies引数にプロキシサーバーの情報を指定します。
import requests url = 'https://api.example.com/data' proxies = { 'http': 'http://proxy.example.com:8080', # HTTPプロキシ 'https': 'http://proxy.example.com:8080' # HTTPSプロキシ (通常はHTTPプロキシと同じ) } try: response = requests.get(url, proxies=proxies) response.raise_for_status() print(response.json()) except requests.exceptions.RequestException as e: print(f"リクエストエラー: {e}")
HTTPSプロキシについて
通常、https プロキシにも http プロキシと同じURLを指定します。
https で始まるURL(https://proxy.example.com:8080)を指定することはまれで、多くの場合、プロキシサーバー側で適切に処理されます。
4. 認証付きプロキシ (Requests使用)
認証が必要なプロキシの場合は、プロキシURLにユーザー名とパスワードを含めます。
import requests url = 'https://api.example.com/data' proxies = { 'http': 'http://username:password@proxy.example.com:8080', 'https': 'http://username:password@proxy.example.com:8080' } try: response = requests.get(url, proxies=proxies) response.raise_for_status() print(response.json()) except requests.exceptions.RequestException as e: print(f"リクエストエラー: {e}")
5. 環境変数からプロキシ設定を読み込む (Requests)
セキュリティの観点から、ユーザー名やパスワードをコードに直接記述するのは避けるべきです。環境変数を使用するのが一般的です。
import os import requests url = 'https://api.example.com/data' # 環境変数からプロキシ情報を取得 (設定されていない場合はNone) http_proxy = os.environ.get('HTTP_PROXY') https_proxy = os.environ.get('HTTPS_PROXY') proxies = {} if http_proxy: proxies['http'] = http_proxy if https_proxy: proxies['https'] = https_proxy try: response = requests.get(url, proxies=proxies) response.raise_for_status() print(response.json()) except requests.exceptions.RequestException as e: print(f"リクエストエラー: {e}")
export HTTP_PROXY="http://username:password@proxy.example.com:8080" export HTTPS_PROXY="http://username:password@proxy.example.com:8080"
Windowsの場合は、システムのプロパティの詳細設定から環境変数を設定します。
6. プロキシ環境下でのAPIリクエスト (urllib使用)
Requestsライブラリを使わずに、標準ライブラリのurllibを使うこともできます。
import urllib.request import json import os url = 'https://api.example.com/data' # 環境変数からプロキシ情報を取得 http_proxy = os.environ.get('HTTP_PROXY') https_proxy = os.environ.get('HTTPS_PROXY') # プロキシハンドラを作成 proxy_handler = urllib.request.ProxyHandler({ 'http': http_proxy, 'https': https_proxy }) # プロキシハンドラを使って ওপেনারを作成 opener = urllib.request.build_opener(proxy_handler) # リクエストを送信 try: with opener.open(url) as response: data = json.loads(response.read().decode('utf-8')) # レスポンスを読み込み、JSONとして解析 print(data) except urllib.error.URLError as e: # urllibのエラーハンドリング print(f"リクエストエラー: {e}")
urllib.request.ProxyHandler でプロキシ設定に基づいたハンドラを作成し、urllib.request.build_opener でそのハンドラを組み込んだオープナーオブジェクトを作成します。opener.open(url) でURLを開き、レスポンスを取得します。レスポンスボディは response.read().decode('utf-8') でバイト列からUTF-8文字列にデコードし、json.loads() でJSONとして解析します。
7. まとめと注意点
RequestsとurllibはどちらもAPIリクエストに使用できますが、Requestsは高機能で使いやすく、広く利用されています。一方、urllibはPython標準ライブラリに含まれているため、追加のインストールは不要です。機密情報はコードに直接記述せず、環境変数や設定ファイルから読み込むようにして、セキュリティに配慮しましょう。
プロキシ環境下でのAPIリクエストを行う際は、必ず try...except ブロックでエラーハンドリングを行いましょう。ネットワーク接続の遅延やプロキシサーバーの応答がない場合に備え、requests.get() や opener.open() に timeout 引数を設定してタイムアウト処理を実装することをおすすめします。プロキシの情報はネットワーク管理者に確認するか、システムのプロキシ設定を参照してください。
最後にPythonの学習に利用できるUdemy
のサイトを紹介します。ぜひ活用ください。
[PR]