今回は、Pythonのrequestsライブラリでプロキシを設定する方法と実装例についてご紹介します。
Pythonのrequestsライブラリは、HTTP通信をシンプルかつ柔軟に扱えることで知られています。
社内ネットワークや特定のセキュリティ要件下では、通信時にプロキシを利用する必要があるケースが存在します。
ここでは、requestsでプロキシを設定する方法や使い方のポイント、よくあるエラーや注意点について解説します。
requestsライブラリとは
requestsライブラリは、Python標準ライブラリのurllibより扱いやすいインターフェースを提供し、簡単にHTTPリクエストを送れるのが特徴です。
GETやPOSTなど基本的なメソッドをはじめ、JSONの送受信や認証など、多彩な機能がサポートされています。
Pythonを使ってWebサービスへアクセスするときに、まず挙げられる代表的なライブラリといえます。
プロキシ設定の基本
requestsでは、リクエストにproxiesパラメータを与えることでプロキシサーバーを利用できます。
プロキシサーバーのURLや認証情報を辞書形式で指定することで、HTTP通信をプロキシ経由で行うことが可能になります。
基本的なプロキシ設定
まずは、もっともシンプルなプロキシ設定例を示します。
1 2 3 4 5 6 7 8 9 10 11 |
import requests # プロキシサーバーのURLとポートを指定 proxies = { "http": "http://your_proxy_address:port", "https": "http://your_proxy_address:port" } # プロキシ経由でリクエストを送信 response = requests.get("http://example.com", proxies=proxies) print(response.status_code) |
この場合、HTTPとHTTPS両方の通信を同じプロキシへルーティングしています。
認証が必要なプロキシ
認証が必要なプロキシサーバーへアクセスする際は、URLにユーザー名とパスワードを含めます。
1 2 3 4 5 6 7 8 9 10 |
import requests # 認証情報付きプロキシを指定 proxies = { "http": "http://username:password@proxy.example.com:8080", "https": "http://username:password@proxy.example.com:8080" } response = requests.get("http://example.com", proxies=proxies) print(response.text) |
ユーザー名とパスワードが含まれることで、認証付きプロキシサーバーに自動的にログインし、リクエストを実行します。
環境変数を活用したプロキシ設定
requestsは、環境変数に設定されたプロキシ情報を自動的に使用します。
以下の例では、OSの環境変数にプロキシURLを設定し、コード側では特別な指定を加えずにアクセスしています。
1 2 3 4 |
import requests response = requests.get("http://example.com") print(response.status_code) |
環境変数の設定をPython内で行うことも可能です。
1 2 3 4 5 6 7 8 |
import os import requests os.environ["HTTP_PROXY"] = "http://your_proxy_address:port" os.environ["HTTPS_PROXY"] = "http://your_proxy_address:port" response = requests.get("http://example.com") print(response.status_code) |
このように、コードを修正せずにプロキシ設定を切り替えられるため、開発環境や運用環境での使い分けにも便利です。
プロキシを経由しないホストの設定
環境変数NO_PROXYを利用すると、プロキシを通したくないホストを除外できます。
1 2 3 4 |
import os # プロキシ対象外にするホストを指定 os.environ["NO_PROXY"] = "localhost,127.0.0.1,example.com" |
上記の場合、localhostやexample.comなどにはプロキシを通さずアクセスします。
タイムアウトや例外処理
プロキシを使用すると、ネットワーク環境やサーバー状況によりタイムアウトやエラーが発生しやすくなる場合があります。
次の例では、タイムアウトと例外処理を併用しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import requests proxies = { "http": "http://username:password@proxy.example.com:8080", "https": "http://username:password@proxy.example.com:8080" } try: response = requests.get("http://example.com", proxies=proxies, timeout=5) response.raise_for_status() # HTTPエラーを例外として扱う print(response.text) except requests.exceptions.ProxyError as e: print("プロキシ接続エラー:", e) except requests.exceptions.Timeout as e: print("タイムアウトエラー:", e) except requests.exceptions.RequestException as e: print("その他のリクエストエラー:", e) |
上記のように細かく例外をキャッチすることで、原因に応じた対応を行いやすくなります。
複数プロキシ(プロキシプール)の利用
大量のリクエストを送信する際など、単一プロキシでは負荷が高まる場合があります。
複数プロキシを用意し、ランダムやラウンドロビンなどの方法で切り替えながら利用すると、安定性が向上することがあります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import random import requests # 複数のプロキシリストを定義 proxy_list = [ "http://proxy1.example.com:8080", "http://proxy2.example.com:8080", "http://proxy3.example.com:8080", ] # ランダムにプロキシを選択 selected_proxy = random.choice(proxy_list) proxies = { "http": selected_proxy, "https": selected_proxy } response = requests.get("http://example.com", proxies=proxies, timeout=5) print(response.status_code) |
この方法を用いると、1つのプロキシに依存せず、障害発生時に切り替えもしやすくなります。
よくあるエラーと注意点
プロキシを利用する際には、いくつかのリスクや注意点があります。
- プロキシの信頼性: 悪意のあるプロキシサーバーを使用すると、通信内容が傍受・改ざんされる可能性があります。
- 認証情報の管理: 認証情報をコード内に直接記載すると、漏洩のリスクが高まります。環境変数や秘密管理システムの活用を検討してください。
- SSL検証: HTTPSの場合は、プロキシ側もSSLに対応している必要があります。verifyパラメータなどを適切に設定してください。
- パフォーマンス: プロキシを経由することで応答速度が遅くなる場合があります。タイムアウトやリトライ設定などの対策を考慮してください。
- 例外処理: ネットワーク障害やプロキシの設定ミスなどで接続エラーが起こることがあります。エラー時のフォールバックも含め、例外処理を丁寧に実装することが重要です。
まとめ
requestsを使えば、プロキシの設定は簡潔な辞書指定から環境変数の利用まで柔軟に行えます。
認証が必要な環境や複数プロキシのローテーションなど、要件にあわせて実装を選択できます。
セキュリティやパフォーマンスを意識しながら、適切にプロキシを導入してみてください。