Python Requests プロキシガイド: 構文、認証、ローテーション、リトライ

プロキシ辞書は3行のコードですが、Requestsでのプロキシエラーは10年分のStack Overflowを埋め尽くしています。ここでは、構文、認証、環境変数、ローテーション、リトライ、SOCKS5を含む完全なセットアップを紹介し、鋭いエッジをラベル付けしています。

Python Requests は依然としてスクレイピングと自動化のデフォルトHTTPクライアントであり、プロキシを指すのは3行の作業です: プロキシ辞書を渡すと、すべてのリクエストがあなたのIPではなくプロキシのIPから出ます。しかし「python requests proxy が動作しない」は10年以上にわたりトップ検索に残っています — プロキシ辞書に関する元のStack Overflowの質問は2011年に遡り、そのトップ回答は480以上の票を持ち、2026年1月にも編集されていました。この構文には鋭いエッジがあります: スキームが欠けていると例外が発生し、httpsキー内の間違ったスキームがSSLエラーを引き起こし、環境変数がコードを静かに上書きします。このPython Requestsプロキシガイドはすべてをカバーします: 構文、認証、環境変数、ローテーション、リトライ、SOCKS5、そして実際に遭遇するエラー。

プロキシ辞書: Python Requests プロキシ構文

proxies 引数はプロトコルをプロキシURLにマッピングします。通常のスクレイピングをカバーする2つのキーがあります — 1つはプレーンHTTPターゲット用、もう1つはHTTPSターゲット用 — どちらも通常同じプロキシを指します:

import requests

proxies = {
    "http": "http://USER:PASS@gate.quantumproxies.io:PORT",
    "https": "http://USER:PASS@gate.quantumproxies.io:PORT",
}

r = requests.get("https://httpbin.org/ip", proxies=proxies, timeout=(5, 30))
print(r.json())  # {'origin': '<proxy exit IP>'}

3つのルールが設定失敗の90%を防ぎます:

プロキシ認証: ユーザー名とパスワード

認証されたプロキシは、URLに埋め込まれたHTTP Basic認証を使用します: http://USER:PASS@host:port。パスワードに@:/が含まれている場合は、urllib.parse.quote(password, safe="")で最初にURLエンコードしてください — エンコードされていない特殊文字はURLを誤った場所で分割し、死んだプロキシのように見える認証失敗を引き起こします。407 Proxy Authentication Requiredの応答は、プロキシ自体があなたを拒否したことを意味します: 誤った資格情報、または未登録のアドレスから呼び出されたIPホワイトリストプラン。両方のケースは407トラブルシューティングガイドで分析されています。1回限りのスクリプトを超えるものには、プロキシをSessionに添付してください — 接続プーリング、クッキーの永続化、すべてを設定する1つの場所を得られます:

import requests

session = requests.Session()
session.proxies = {
    "http": "http://USER:PASS@gate.quantumproxies.io:PORT",
    "https": "http://USER:PASS@gate.quantumproxies.io:PORT",
}
session.headers.update({"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"})

r = session.get("https://httpbin.org/ip", timeout=(5, 30))
print(r.status_code, r.json())

環境変数とtrust_env

Requestsは環境からプロキシ設定も読み取ります — curlやほとんどのUnixツールが尊重する同じ変数です: HTTP_PROXYHTTPS_PROXYALL_PROXYNO_PROXY(除外するホストのカンマリスト、例: localhost,127.0.0.1,.internal)。これは、コードに触れずにRequestsを使用するサードパーティライブラリをプロキシする最もクリーンな方法です。優先順位は明示的が暗黙的を上回ります: 呼び出し時のproxies=引数が勝ち、次にsession.proxies、次に環境です。知っておく価値のある関連ツールが2つあります: session.trust_env = Falseはすべての環境検索をオフにします — コーポレートプロキシ変数がスクレイパーを乗っ取る場合の修正です — そしてurllib.request.getproxies()はOSレベルのプロキシ設定(macOSとWindowsのシステム設定を含む)をRequestsが期待する辞書形で返します。

Python Requests プロキシフローの図: プロキシ辞書が各リクエストを回転ゲートウェイCONNECTトンネルを通じてターゲットサイトにルートします
辞書がルートを選び、ゲートウェイが出口IPを提供します。リクエストごとのローテーションで、同じ2行の設定で毎回新しいIPが得られます。

ローテーション: 1つのゲートウェイがプロキシリストを上回る

従来のローテーションレシピ — IPリストをロードし、リクエストごとにrandom.choice()を使用し、死んだものを削除する — はもう構築する必要のない機械です。回転ゲートウェイはサーバー側でそれを行います: 1つのエンドポイントを設定し、プロバイダーがプールから毎回新しい出口IPを割り当てます。回転住宅プロキシを通じて、そのプールは200以上の国にまたがる90M以上の家庭IPで構成されているため、1000のリクエストが1000の異なる訪問者のように見え、ローテーションロジックは1行も必要ありません:

import requests

proxies = {
    "http": "http://USER:PASS@gate.quantumproxies.io:PORT",
    "https": "http://USER:PASS@gate.quantumproxies.io:PORT",
}

for _ in range(3):
    r = requests.get("https://httpbin.org/ip", proxies=proxies, timeout=(5, 30))
    print(r.json()["origin"])  # a different exit IP on each iteration

フローが複数のリクエストにまたがる場合 — ログイン、カートに追加、チェックアウト — リクエストごとのローテーションはセッションを壊します。スティッキーセッションがそれを解決します: プロキシユーザー名のセッションパラメータが設定ウィンドウの1つの出口IPを固定し、その後ローテーションします。同じエンドポイント、1つの文字列変更です。単純なループを超えてスケーリングしている場合は、httpxまたはaiohttpを使用した非同期Pythonがスループットを倍増させ、Scrapyのミドルウェアシステムがローテーション、リトライ、禁止処理をフレームワーク設定として提供します。

悪い出口を乗り越えるリトライとタイムアウト

プレミアムプールでも時折遅いまたは死にかけの出口を提供するため、プロダクションコードには2つのガードが必要です: 各リクエストにタイムアウトを設定すること(Requestsはデフォルトで永遠に待機します)と、バックオフ付きの自動リトライです。タイムアウトは(connect, read)タプルを取り、到達不能なプロキシで早く失敗し、ページ読み取りを遅く許可します。リトライはurllib3を介してトランスポート層にマウントされます:

import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

retry = Retry(
    total=4,
    backoff_factor=1,  # exponential backoff between attempts
    status_forcelist=[429, 500, 502, 503, 504],
    allowed_methods=["GET", "HEAD"],
)

session = requests.Session()
session.mount("http://", HTTPAdapter(max_retries=retry))
session.mount("https://", HTTPAdapter(max_retries=retry))
session.proxies = {
    "http": "http://USER:PASS@gate.quantumproxies.io:PORT",
    "https": "http://USER:PASS@gate.quantumproxies.io:PORT",
}

r = session.get("https://httpbin.org/ip", timeout=(5, 30))

回転ゲートウェイを使用すると、この組み合わせは静かに強力です: 各リトライは自動的に異なる出口IPを通過するため、1つの不安定なアドレスが4回連続でリクエストを失敗させることはありません。

RequestsでのSOCKS5プロキシ

SOCKSサポートは追加です: pip install requests[socks]でインストールします。その後、辞書の構文は同じです — スキームだけが変わります。socks5h://socks5://より優先してください: hはDNS解決をプロキシに押し付け、実際のネットワークからのDNSリークを防ぎ、出口の位置からの地理的に制限されたホスト名を解決します。すべてのQuantumProxiesプランは同じゲートウェイでHTTPおよびSOCKS5プロキシの両方を公開しているため、プロトコルの切り替えはスキームの交換であり、新しい購入ではありません:

proxies = {
    "http": "socks5h://USER:PASS@gate.quantumproxies.io:PORT",
    "https": "socks5h://USER:PASS@gate.quantumproxies.io:PORT",
}
動作するPython Requestsプロキシ設定を5つの一般的な間違いと比較するチェックリスト
5つの間違いがほとんどの失敗を引き起こします: スキームが欠けている、httpsキーにhttps://がある、エンコードされていないパスワード、SOCKSの追加がない、タイムアウトがない。

一般的なPython Requestsプロキシエラー、解読済み

スタックトレースとその根本原因を詳しく見るには、RequestsでのProxyError、SSLError、ConnectTimeoutのデバッグを参照してください。

よくある質問

Python Requestsでプロキシを使用するにはどうすればいいですか?

httphttpsキーを持つproxies辞書を任意のリクエストメソッドに渡します: requests.get(url, proxies={...})。各値はスキームを含む完全なプロキシURLであり、資格情報はhttp://user:pass@host:portとして埋め込まれます。同じ辞書をSessionに添付して、すべてのリクエストに自動的に適用します。

なぜ私のPython Requestsプロキシが動作しないのですか?

通常の4つの疑わしい点を順に確認してください: プロキシURLにhttp://スキームが欠けている、httpsキー内でhttps://が使用されている、URLエンコードされていないパスワード内の特殊文字、環境変数がコードを上書きしている。curlで同じ資格情報をテストしてください — curlが成功すれば、問題は辞書にあります。

Python RequestsはSOCKS5プロキシをサポートしていますか?

はい、追加の依存関係をpip install requests[socks]でインストールした後です。socks5h://スキームをプロキシ辞書で使用して、DNS解決をプロキシ側で行うようにします — プレーンなsocks5://スキームはホスト名をローカルで解決し、DNSクエリをリークし、地理的にターゲットされたスクレイピングを壊す可能性があります。

環境変数でプロキシを設定するにはどうすればいいですか?

HTTP_PROXYHTTPS_PROXYを完全なプロキシURLでエクスポートし、オプションで除外するホスト用にNO_PROXYを設定します。Requestsはそれらを自動的に取得し、Requestsを基にしたサードパーティライブラリもプロキシします。コードが環境を完全に無視するようにするには、session.trust_env = Falseを設定します。

それが全ツールキットです: 2つのキーの辞書、URL内の資格情報、1回のリトライマウント、そしてローテーションがコードではなくゲートウェイによって処理されます。構文が修正できない唯一のことはIPの品質です — 完璧に構成されたデータセンタープロキシでも住宅出口が通過するところでブロックされます。クリーンなコードとクリーンなIPを組み合わせれば、Requestsは驚くほど大きな作業負荷を処理します。

最初から動作する住宅プロキシを入手