クイックアンサー
プロキシでの407 Proxy Authentication Requiredとは何を意味していますか?
407 Proxy Authentication Required は、認証情報がないか誤っているため、プロキシがリクエストを拒否したことを示します。ターゲットウェブサイトには一切接触していません。CrawlRelayの住宅用プロキシでは、ユーザー名がダッシュボードの表示通りか、パスワードが一致するか、どちらかに特殊文字がある場合はURLエンコードされているかの三点を確認してください。同じリクエストの再試行は407を解決しません。
407 Proxy Authentication Requiredを一目で理解する
| エラー | 407 Proxy Authentication Required |
|---|---|
| タイプ | HTTPステータスコード(4xx、クライアントエラー) |
| 送信元 | プロキシゲートウェイであり、ターゲットのウェブサイトではありません |
| 定義されている場所 | RFC 9110, section 15.5.8 (headers: Proxy-Authenticate 11.7.1, Proxy-Authorization 11.7.2) |
| 再試行しますか? | いいえ。同じ認証情報では再度失敗します。まずそれらを修正してください |
| まず確認すること | 以下のcurlテストを、ベアユーザー名でターゲット指定パラメータなしで実行してください |
407 Proxy Authentication Requiredとは何ですか?
407はプロキシから返されるもので、アクセスしたいサイトからではありません。RFC 9110では、これはプロキシ版の401であり、クライアントはまずプロキシで認証が必要であると説明されています。プロキシはProxy-Authenticateヘッダーを返し、その方式を示しますが、ほぼ常にBasicです。クライアントはProxy-AuthorizationヘッダーでBase64エンコードされたusername:passwordを返信します。
HTTPSターゲットの場合、407はトンネルを開くCONNECTリクエストに対して返ります。そのため、多くのライブラリがこれをトンネルや接続のエラーと報告し、HTTPステータスとは扱いません。ウェブサイトとのTLSセッションは開始されていません。
a 407はPython、curl、Node.js、ブラウザではどのように表示されますか?
同じ失敗でもツールごとに異なる表示になります。ログ検索用のメッセージは以下の通りです:
- Python requests:
ProxyError('Unable to connect to proxy', OSError('Tunnel connection failed: 407 Proxy Authentication Required')) - curl:
curl: (56) CONNECT tunnel failed, response 407 - Scrapy:
TunnelError: Could not open CONNECT tunnel with proxy ... [{'status': 407, 'reason': b'Proxy Authentication Required'}] - Chrome、Playwright、Puppeteer:
net::ERR_TUNNEL_CONNECTION_FAILED、または可視ブラウザのログインポップアップ - http://ターゲットでのNode.jsクライアント:
Request failed with status code 407
a 407の原因は何ですか?
最も可能性が高いのは次の通りです:
- ユーザー名またはパスワードの誤り。 タイプミス、リセット後の古いパスワード、別のサブユーザーの認証情報。
- エンコードされていない特殊文字。 パスワードに
@、:、/、#が含まれている場合、user:pass@hostURLが壊れます。パーセントエンコードしてください:@は%40に、:は%3Aになります。 - ターゲティングサフィックスが破損。 ユーザー名でターゲティングを読むゲートウェイは、長い一つのユーザー名として認識します。キーや国コードのタイプミスがあると、プロキシが認識しないユーザー名になります。
- コードから出ない認証情報。 Chromeは
--proxy-server内部のユーザー名とパスワードを無視します。Puppeteerにはpage.authenticate()が必要で、Seleniumにはローカルフォワーダーが必要です。 - 残高不足。 トラフィックがまだ残っているか確認してください、コードのデバッグ前に。
a 407を段階的に診断するには?
- curlで認証情報をターゲティングなしでテスト(下記コマンド)。詳細出力に
HTTP/1.1 407行があれば認証情報の問題です。 - ターゲティングパラメータを一つずつ戻し、それぞれテストを再実行します。
- プログラムが実際に構築したプロキシURLをパスワードを隠してログに取り、ダッシュボードのものと文字単位で比較します。
- 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_URLa 407をどう修正しますか?
- Pythonでは
urllib.parse.quote(value, safe='')、JavaScriptではencodeURIComponent()で認証情報をエンコードしてURLを作成してください。 - ブラウザでは、Playwrightの
proxyオプションにusernameとpasswordを渡し、Puppeteerでpage.authenticate()を呼び出し、Seleniumにはローカルフォワーダーを使います。PlaywrightとPuppeteer](/docs/puppeteer/)のガイドもご覧ください。 - 環境変数に
HTTPS_PROXYを設定する場合は、シェルで全体を引用符で囲み、@と$が残るようにしてください。 - 漏洩が疑われる場合はダッシュボードでパスワードをローテーションし、関連するすべてのスクレイパーを更新してください。
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)from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(proxy={
"server": "http://gw.crawlrelay.com:7777",
"username": "USERNAME-country-us",
"password": "PASSWORD",
})
page = browser.new_page()
response = page.goto("https://api.ipify.org")
print(response.status, page.inner_text("body"))
browser.close()a 407の後に再試行すべきですか?
407を自動で再試行しないでください。認証情報が同じであれば同じ答えが返り、連続したループはログを埋めるだけです。407は設定エラーとして扱い、ジョブを停止して認証情報を修正の上再起動してください。数日間正常だったジョブで突然407が出た場合、パスワードが変わったかサブユーザーが無効化されています。
407 Proxy Authentication RequiredはCrawlRelayにどう関係しますか?
CrawlRelayのゲートウェイは新規コネクションごとにユーザー名とパスワードを読み取ります。ターゲティングとセッション設定はユーザー名に存在するため、有効なパスワードでもサフィックスが壊れていると失敗します。ユーザー名はヘルパー関数一つで構築し、起動時に一度出力ログを取ってください。クイックスタートページには正確な書式があります。
ゲートウェイ:gw.crawlrelay.com、ポート7777(HTTP、HTTPSはCONNECT経由)、ポート7778(SOCKS5)。ユーザー名形式:USERNAME-country-{cc}-state-{state}-city-{city}-zip-{zip}-asn-{asn}-session-{id}-ttl-{minutes}。関連情報:401 vs 407 · ERR_TUNNEL_CONNECTION_FAILED · プロキシに接続できません。
407 Proxy Authentication Required:開発者がよく尋ねる質問
407は私がスクレイピングしているウェブサイトから送信されますか?
いいえ。407は常にあなたとウェブサイトの間に介在するプロキシから送信されます。リクエストはウェブサイトに到達していないため、トラフィックを検知したりカウントしたり遮断したりすることはありません。ウェブサイトがログインを望む場合は401を返します。プロキシの認証情報を修正すれば407は消えます。
curlが同じプロキシで動くのに私のコードはなぜ407になるの?
あなたのライブラリが認証情報を送信していないか、異なる形式で送っています。主な原因は、ブラウザのフラグにタイプされた認証情報が無視されている、特殊文字が失われた環境変数、URLエンコードされていないパスワードです。実際にコードが作成するプロキシURL(パスワードは伏せる)を表示し、curlコマンドと比較してください。
407は私のプランのトラフィックを使いますか?
407応答は数百バイトで、リクエストはターゲットに到達しないためページはダウンロードされません。コストがかかるのは別の部分で、407のリトライループに陥ったスクレイパーが時間を浪費しログを埋めます。エラー処理では407を停止点にしてください。
他のプロキシエラーのリファレンス
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レジデンシャルプロキシ、期限切れがないトラフィック。