urllib3でプロキシIPを使う
HTTPプロキシにはProxyManagerを選び、urllib3の応答フィールド、再試行、SOCKS専用マネージャーを確認します。
urllib3で簡単なプロキシ診断をするには、再試行を無効にしてProxyManagerを使います。動かなくなった項目を何度も試して待つ代わりに、最初の試行結果を確認できます。uvで管理するプロジェクトでは次のようにします。
uv add urllib3ドキュメント用の接続先を、利用中のサービスまたはHTTPプロキシ一覧のHTTPプロキシに置き換え、そのマネージャーでリクエストを送ります。
import urllib3
proxy = urllib3.ProxyManager(
"http://203.0.113.10:8080",
timeout=urllib3.Timeout(connect=5, read=10),
retries=False,
)
try:
response = proxy.request("GET", "https://example.com/")
print(response.status)
print(response.data.decode("utf-8", errors="replace")[:200])
finally:
proxy.clear()
最初にresponse.statusを読み、続いてresponse.dataを確認します。これらがurllib3のフィールドです。Requests流のstatus_codeやtextは代わりになりません。サイトの拒否応答が正常なプロキシ経由で届くこともあります。一方、応答前の例外はリクエストを完了できなかったことを示します。
retries=Falseは診断用の選択であり、本番の再試行方針ではありません。接続5秒と読み取り10秒は各段階を制限するもので、合計15秒以内の完了を保証しません。DNSや応答の進み方も待ち時間全体に影響します。
例では本文を先に読み込み、最後にマネージャーのプールを空にします。同じ接続先へ繰り返し送る場合は、接続を再利用できるよう作業終了までそのマネージャーを保持します。preload_content=Falseにするとライフサイクルが変わり、呼び出し側がストリーム応答を読み、解放する必要があります。
待ち受け側に合うマネージャーを選んでください。通常のPoolManagerは、別の場所にURLを保存してもプロキシ対応にはなりません。SOCKSにはurllib3.contrib.socks.SOCKSProxyManagerとその任意依存関係を使います。上のコードはHTTPのProxyManager経路です。