快速回答
代理中的407 Proxy Authentication Required是什么意思?
407 代理身份验证要求 表示代理拒绝了您的请求,因为它未收到凭据或凭据错误。目标网站根本未被访问。使用 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。您的客户端则使用带有 Base64 编码的 Proxy-Authorization 头部响应 username:password。
对于 HTTPS 目标,407 是对打开隧道的 CONNECT 请求的响应。这也是许多库将其报告为隧道或连接错误而非 HTTP 状态码的原因:与网站建立的 TLS 会话根本未启动。
在Python、curl、Node.js和浏览器中a 407是什么样?
每个工具中相同的失败会有不同的提示信息。请在日志中搜索以下信息:
- 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,或者浏览器中弹出的登录窗口 - Node.js 客户端访问 http:// 目标:
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_URL如何修复a 407?
- 在构造 URL 前,使用 Python 的
urllib.parse.quote(value, safe='')或 JavaScript 的encodeURIComponent()对凭据进行编码。 - 浏览器中,在 Playwright 的
proxy参数里传递username和password,Puppeteer 中调用page.authenticate(),Selenium 使用本地转发。参见 Playwright ] 和 Puppeteer ] 指南。 - 环境变量中,如果设置了
HTTPS_PROXY,请在 shell 中用引号括全以保留@和$字符。 - 如果怀疑泄露,请在控制面板中更新密码,并同步更新所有使用该密码的爬虫。
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(通过CONNECT的HTTP、HTTPS)和端口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 将消失。
为何我的代码使用相同代理时出现 407,而 curl 正常?
您的库没有发送凭据,或以不同格式发送。常见原因是将凭据输错浏览器标记,导致被忽略;环境变量中丢失特殊字符;或密码未 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 错误
带有涵盖失败案例文档的住宅代理
来自US$0.50/GB的CrawlRelay住宅代理,流量永不过期。