无需 KYC —— 无需身份证、自拍、文件证明。支持加密货币支付:BTC, USDT, USDC, ETH, SOL, LTC
语言: 简体中文
开始使用

代理错误参考 · HTTP 状态码

407 代理身份验证要求:含义及修复方法

HTTP 状态码(4xx,客户端错误):每个工具中的精确错误信息、可能原因排序及有效解决方案。

最后更新:

快速回答

代理中的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@host URL。请百分比编码:@ 转为 %40,: 转为 %3A。
  • 目标后缀格式错误。 如果代理从用户名中读取目标信息,则用户名应为完整格式。关键字或国家码的拼写错误会导致代理无法识别该用户名。
  • 凭据未发送出去。 Chrome 会忽略在 --proxy-server 内写入的用户名和密码。Puppeteer 需要 page.authenticate(),Selenium 则需要本地转发代理。
  • 余额为零。 请先确认账户仍有流量余额再调试代码。

如何一步步诊断a 407?

  1. 使用 curl 测试凭据且不要带任何目标参数(如下命令)。详尽输出中出现 HTTP/1.1 407 表示凭据有问题。
  2. 逐个添加目标参数,每添加一个重测一次。
  3. 记录程序实际生成的代理 URL(密码隐藏),并逐字符与控制面板对比。
  4. 若 curl 成功但程序失败,说明库未发送凭据。请参阅以下针对工具的修复方法。
用curl测试失败的URL(HTTP端口,详细模式)
# 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 中用引号括全以保留 @ 和 $ 字符。
  • 如果怀疑泄露,请在控制面板中更新密码,并同步更新所有使用该密码的爬虫。
Python:用编码后的凭证构建代理URL
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)
Playwright(Python):凭证作为独立字段
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 状态码

浏览器和客户端错误

连接和 TLS 错误

带有涵盖失败案例文档的住宅代理

来自US$0.50/GB的CrawlRelay住宅代理,流量永不过期。

从 US$0.50/GB 开始 · 无需 KYC

开始使用