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%を防ぎます:
- スキームは必須です。 Requests 2.0.0以降、
http://のないプロキシURLはMissingSchemaを引き起こします。1.xではip:port文字列が機能しましたが、2.0で全てが壊れました。 httpsキー内にhttp://を使用します。 キーはターゲットプロトコルを指定し、値はプロキシへの到達方法を指定します。プロキシはプレーンHTTPを受け入れ、CONNECTリクエストを介してTLSをトンネルします。そこにhttps://を書くことはSSLError: UNEXPECTED_EOF_WHILE_READINGの古典的な原因です。- キーは特定のホストをターゲットにできます。
https://api.example.comのようなキーは、特定のホストのみを指定されたプロキシを通じてルートします — 難しいドメインを住宅IPを通じて送信し、他のすべてを直接送信するのに便利です。
プロキシ認証: ユーザー名とパスワード
認証されたプロキシは、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_PROXY、HTTPS_PROXY、ALL_PROXY、NO_PROXY(除外するホストのカンマリスト、例: localhost,127.0.0.1,.internal)。これは、コードに触れずにRequestsを使用するサードパーティライブラリをプロキシする最もクリーンな方法です。優先順位は明示的が暗黙的を上回ります: 呼び出し時のproxies=引数が勝ち、次にsession.proxies、次に環境です。知っておく価値のある関連ツールが2つあります: session.trust_env = Falseはすべての環境検索をオフにします — コーポレートプロキシ変数がスクレイパーを乗っ取る場合の修正です — そしてurllib.request.getproxies()はOSレベルのプロキシ設定(macOSとWindowsのシステム設定を含む)をRequestsが期待する辞書形で返します。

ローテーション: 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プロキシエラー、解読済み
- MissingSchema — プロキシURLに
http://が欠けています。Requests 2.0.0以降必須です。 - ProxyError: Cannot connect to proxy — ホストまたはポートが間違っているか、プロキシが死んでいます。コードを非難する前にcurlでエンドポイントを確認してください。
- SSLError / UNEXPECTED_EOF_WHILE_READING — 通常は
httpsキー内のhttps://です。値のスキームをhttp://に設定してください。 - 407 Proxy Authentication Required — 誤った資格情報、パスワード内のエンコードされていない特殊文字、またはホワイトリストに登録されていないソースIP。
- ConnectTimeout / ReadTimeout — 遅い出口または遅いターゲット。
timeout=(5, 30)を設定し、リトライで新しいIPにローテーションさせてください。 - Proxy works in curl, fails in Python — 環境変数が辞書を上書きしています。
session.proxiesを印刷し、trust_env = Falseを試してください。
スタックトレースとその根本原因を詳しく見るには、RequestsでのProxyError、SSLError、ConnectTimeoutのデバッグを参照してください。
よくある質問
Python Requestsでプロキシを使用するにはどうすればいいですか?
httpとhttpsキーを持つ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_PROXYとHTTPS_PROXYを完全なプロキシURLでエクスポートし、オプションで除外するホスト用にNO_PROXYを設定します。Requestsはそれらを自動的に取得し、Requestsを基にしたサードパーティライブラリもプロキシします。コードが環境を完全に無視するようにするには、session.trust_env = Falseを設定します。
それが全ツールキットです: 2つのキーの辞書、URL内の資格情報、1回のリトライマウント、そしてローテーションがコードではなくゲートウェイによって処理されます。構文が修正できない唯一のことはIPの品質です — 完璧に構成されたデータセンタープロキシでも住宅出口が通過するところでブロックされます。クリーンなコードとクリーンなIPを組み合わせれば、Requestsは驚くほど大きな作業負荷を処理します。