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経路です。

関連記事