# 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ターゲット用 — どちらも通常同じプロキシを指します:

```python
import requests

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

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トラブルシューティングガイド](https://quantumproxies.io/blog/fix-407-proxy-authentication-required)で分析されています。1回限りのスクリプトを超えるものには、プロキシを`Session`に添付してください — 接続プーリング、クッキーの永続化、すべてを設定する1つの場所を得られます:

```python
import requests

session = requests.Session()
session.proxies = {
    "http": "http://USER:PASS@residentialpremium.quantumproxies.io:8080",
    "https": "http://USER:PASS@residentialpremium.quantumproxies.io:8080",
}
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が期待する辞書形で返します。

![同じ2つのキーを持つproxies辞書が、ループの3回の反復をローテーションゲートウェイのCONNECTトンネルに送り、httpbin.org/ipは毎回異なるoriginを返す：出口IPのA、B、C。カードの要点：辞書が経路を選び、トンネルがTLSをターゲットまで運び、ゲートウェイが呼び出しごとに新しい出口IPを供給する。](https://res.cloudinary.com/dmqliab0t/image/upload/f_auto,q_auto,w_1200/v1785335141/blog/generated/qp-b9-001-diag1.png)
*辞書がルートを選び、ゲートウェイが出口IPを提供します。リクエストごとのローテーションで、同じ2行の設定で毎回新しいIPが得られます。*

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

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

```python
import requests

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

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](https://quantumproxies.io/blog/python-async-scraping-httpx-aiohttp-proxies)がスループットを倍増させ、[Scrapyのミドルウェアシステム](https://quantumproxies.io/blog/scrapy-rotating-proxy-middleware)がローテーション、リトライ、禁止処理をフレームワーク設定として提供します。

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

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

```python
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@residentialpremium.quantumproxies.io:8080",
    "https": "http://USER:PASS@residentialpremium.quantumproxies.io:8080",
}

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プロキシ](https://quantumproxies.io/socks5-proxies)の両方を公開しているため、プロトコルの切り替えはスキームの交換であり、新しい購入ではありません:

```python
proxies = {
    "http": "socks5h://USER:PASS@residentialpremium.quantumproxies.io:1080",
    "https": "socks5h://USER:PASS@residentialpremium.quantumproxies.io:1080",
}
```

![Python Requestsのプロキシ設定における5つの間違いとその結果：スキームがないとMissingSchema、httpsキーにhttps://を書くとSSLError、エンコードしていないパスワードでは407、SOCKSにはrequestssocksのextraが必要、タイムアウトなしでは永遠に待ち続ける。カードの要点：3つのルールで設定の失敗の90%を防げる。](https://res.cloudinary.com/dmqliab0t/image/upload/f_auto,q_auto,w_1200/v1785335141/blog/generated/qp-b9-001-diag2.png)
*5つの間違いがほとんどの失敗を引き起こします: スキームが欠けている、httpsキーにhttps://がある、エンコードされていないパスワード、SOCKSの追加がない、タイムアウトがない。*

## 一般的な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のデバッグ](https://quantumproxies.io/blog/python-requests-proxyerror-fix)を参照してください。

## よくある質問

### 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は驚くほど大きな作業負荷を処理します。

[最初から動作する住宅プロキシを入手](https://quantumproxies.io/residential-proxies)
