クイックアンサー
プロキシでのCannot connect to proxy (ProxyError)とは何を意味していますか?
'Unable to connect to proxy' はラッパーエラーです。Pythonのrequestsとurllib3はその中に本当の理由を入れます。最も内側の原因を読み取ってください。'Connection refused'やタイムアウトはホスト、ポート、またはネットワークの問題を意味し、'Failed to resolve'はDNS、'Tunnel connection failed: 407'は認証情報の問題を表しています。CrawlRelayではそれぞれ一行で解決できます。
Cannot connect to proxy (ProxyError)を一目で理解する
| エラー | Cannot connect to proxy (ProxyError) |
|---|---|
| タイプ | クライアントライブラリエラー(Python, Node.js) |
| 送信元 | プロキシと通信前または通信中のHTTPクライアント |
| 定義されている場所 | Library error; read the nested cause for the real reason |
| 再試行しますか? | ネストされた原因に依存します |
| まず確認すること | 最も内側の例外を読み取ってください:拒否、タイムアウト、名前解決、またはステータスコード |
Cannot connect to proxy (ProxyError)とは何ですか?
urllib3はプロキシに関する失敗ごとにProxyErrorを発生させ、requestsがそれを渡します。役立つ情報はトレースバックの最後の長い行でプリントされるネストされた例外にあります。
Node.jsクライアントは異なる挙動を示し、プロキシのアドレスであることを言わずにECONNREFUSEDやETIMEDOUTのようなソケットエラーを直接報告します。
'Cannot connect to proxy'はPython、curl、Node.js、ブラウザではどのように表示されますか?
同じ失敗でもツールごとに異なる表示になります。ログ検索用のメッセージは以下の通りです:
- 拒否:
ProxyError('Unable to connect to proxy', NewConnectionError(... Connection refused)) - DNS:
NameResolutionError(... Failed to resolve ...)がProxyError内にあります - 認証情報:
OSError('Tunnel connection failed: 407 Proxy Authentication Required') - ゲートウェイエラー:
OSError('Tunnel connection failed: 502 Bad Gateway') - Node.js:
Error: connect ECONNREFUSED,ETIMEDOUTまたはENOTFOUNDその後にプロキシのアドレスが続きます
'Cannot connect to proxy'の原因は何ですか?
最も可能性が高いのは次の通りです:
- プロキシURLのホストまたはポートが間違っている
- スキームの欠落:
host:portにhttp://がないと、一部のライブラリで予想外の解析になります。 - ネットワークやサーバーでアウトバウンドトラフィックがブロックされている
- CONNECTステップで表面化する認証情報またはゲートウェイエラー が同じ例外に包まれている
- 古いプロキシを指しコードを上書きする環境変数 のような
HTTPS_PROXY
'Cannot connect to proxy'を段階的に診断するには?
- 完全な例外を表示し、最後のネストされた原因を読み取ってください。
- 何が設定されているかを見るために
requests.utils.get_environ_proxies(url)またはHTTP_PROXY,HTTPS_PROXYとNO_PROXYの変数を表示します。 - 同じマシンから下のcurlテストを実行します。
- 原因と以下の修正リストを照合します。
# Use the URL that fails; with https://api.ipify.org instead, you test the gateway alone.
# "HTTP/1.1 200 Connection established" first, then the site's own status: the site answered.
curl -v -x http://USERNAME:[email protected]:7777 https://TARGET_URL
# Same test through the SOCKS5 port, with DNS resolved at the exit
curl -v --socks5-hostname gw.crawlrelay.com:7778 --proxy-user USERNAME:PASSWORD https://TARGET_URL'Cannot connect to proxy'をどう修正しますか?
- 拒否またはタイムアウト: ホストとポートを修正するか、ゲートウェイへのアウトバウンドトラフィックを開放してください。
- 名前解決失敗: マシンのDNSを確認し、
nslookupでそのホストを試してください。 - 407: 認証情報を修正しURLエンコードしてください。詳細は407 Proxy Authentication Requiredを参照してください。
- 502または504: 新しい出口で再試行してください。502 と 504を参照。
- 望ましくない環境プロキシ: requestsでの
session.trust_env = Falseの設定か、変数をクリアしてください。
from urllib.parse import quote
import requests
user = "USERNAME-country-us"
password = "p@ss:word/1" # example containing special characters
# safe="" also encodes "/", "@" and ":" inside the credentials
proxy = "http://{}:{}@gw.crawlrelay.com:7777".format(
quote(user, safe=""), quote(password, safe="")
)
proxies = {"http": proxy, "https": proxy} # http:// for both keys
r = requests.get("https://api.ipify.org", proxies=proxies, timeout=(10, 30))
print(r.status_code, r.text)'Cannot connect to proxy'の後に再試行すべきですか?
タイムアウトや502、504などのゲートウェイエラーといったネットワークレベルの原因のみ再試行してください。拒否された接続、DNS失敗、407は設定を変えるまで繰り返されるため、エラー処理で致命的に扱います。
Cannot connect to proxy (ProxyError)はCrawlRelayにどう関係しますか?
CrawlRelayの場合、プロキシURLはhttp://USERNAME:PASSWORD@の後に以下に記載のゲートウェイホストとHTTPポートが続き、HTTPもHTTPSも同じです。requestsのhttpとhttpsキーには同じhttp:// URLを使います。スキームはプロキシとの通信プロトコルを示し、ウェブサイトへのものではありません。
ゲートウェイ:gw.crawlrelay.com、ポート7777(HTTP、HTTPSはCONNECT経由)、ポート7778(SOCKS5)。ユーザー名形式:USERNAME-country-{cc}-state-{state}-city-{city}-zip-{zip}-asn-{asn}-session-{id}-ttl-{minutes}。関連情報:SSL: WRONG_VERSION_NUMBER · 407 · Python ガイド。
Cannot connect to proxy (ProxyError):開発者がよく尋ねる質問
'Max retries exceeded with url'はプロキシでどういう意味ですか?
これはurllib3が再試行回数の上限に達したことを意味し、'Caused by'の箇所に本当の理由が続きます。プロキシの場合、その部分は通常ネストされた原因を伴うProxyErrorで、接続拒否、タイムアウト、名前解決失敗、あるいは407のようなトンネル状態です。
なぜrequestsは私が設定していないプロキシを使うのですか?
requestsはデフォルトでHTTP_PROXY、HTTPS_PROXY、NO_PROXYの環境変数を読み取り、Windowsではシステムのプロキシ設定も読み込みます。残った値が期待を上書きします。session.trust_env = Falseを設定するか、プロキシを明示的に各リクエストに渡してください。
プロキシアドレスの前にhttp://かhttps://を書きますか?
サイトがHTTPSでも、HTTPプロキシの場合はhttp://を書きます。スキームはクライアントがプロキシとどう通信するかを示します。https://と書くと新版urllib3はTLSでプロキシと通信を開始し、HTTPプロキシポートでSSLエラーになります。
他のプロキシエラーのリファレンス
HTTPステータスコード
- 401 Unauthorized vs 407
- 403 Forbidden
- 407 Proxy Authentication Required
- 429 Too Many Requests
- 502 Bad Gateway
- 503 Service Unavailable
- 504 Gateway Timeout
ブラウザとクライアントのエラー
接続とTLSエラー
失敗ケースを網羅したドキュメント付きレジデンシャルプロキシ
$0.50/GB発のCrawlRelayレジデンシャルプロキシ、期限切れがないトラフィック。