跳到正文

Selenium headless 代理不生效:3 个原因

几分钟内查清 Chrome 到底有没有走你的代理,并解决最常见的账号密码问题。

最常见的 3 个原因

原因 1:账号密码写在了代理地址里。Chrome 的文档写明它不使用嵌在代理设置里的账号密码,所以 --proxy-server=http://LOGIN:PASSWORD@HOST:PORT 并不会登录。有界面时你也许会看到登录框、手动填过一次;headless 没有窗口可填,页面就直接失败。

原因 2:有界面和 headless 用的不是同一个代理来源。Chromium 网络栈默认使用系统网络设置,桌面上的浏览器配置里还可能装着代理扩展;容器或 CI 里两样都没有,同一份脚本就会用机器自己的 IP 出去,或者直接连不上。

原因 3:协议或端口对不上。Proxy302 网关的 HTTP 和 SOCKS5 端口不同(2222 和 3333),而 Chrome 不支持带认证的 SOCKS5。用 Selenium 驱动 Chrome 跑带账号密码的 SOCKS5,无论 headless 怎么设都不会通。

第四种看起来像掉线:轮换线路每个新连接换一个 IP,长脚本中途看到出口 IP 变了,这是线路本身的规则,不是故障。

给 Chrome 设代理的几种办法,以及它们怎么处理账号密码

给 Chrome 设代理的几种办法,以及它们怎么处理账号密码
项目能处理账号密码吗说明
--proxy-server=http://HOST:PORT否用于不需要登录的代理;需要登录时请求会被拒
地址里带账号密码(http://LOGIN:PASSWORD@HOST:PORT)否Chrome 不使用嵌在代理设置里的账号密码
Selenium 的 Proxy 对象(options.proxy)否只设置地址和类型,没有 Chrome 能用的登录信息
本地转发器(如 gost)替你加上登录是Chrome 连本机 127.0.0.1,不需要登录;由转发器去登录代理
selenium-wire有,README 有说明仓库已于 2024 年 1 月 3 日归档、不再维护,新项目不建议用

依据 2026 年 11 月 13 日读到的 Chromium 代理文档、Selenium 驱动选项页和 selenium-wire 仓库。「是」表示文档有说明,请用你自己的 Chrome 和 chromedriver 版本实测。

按 4 步检查

  1. 第 1 步:先在浏览器之外测通账号密码

    打开「我的资产」,复制 HOST、PORT、USERNAME、PASSWORD,运行下面代码块里的 curl 那一行。应当打印出口 IP 和国家。curl 都不通,问题在代理信息,和 Selenium、headless 无关。

    预期结果 curl 打印出代理的出口 IP。

  2. 第 2 步:浏览器用 HTTP 端口

    Chrome 不支持带登录的 SOCKS5,所以给它用 HTTP 的资产(Proxy302 上是 2222 端口)。按 IP 租用的静态 IP 即使买的是 SOCKS5,同一组账号密码也能走 2222 的 HTTP(2026 年 11 月 4 日实测);其他资产只认创建时选的协议。

  3. 第 3 步:开一个本地转发器,让 Chrome 连它

    运行下面的 gost 那一行。它监听 127.0.0.1:8080,替你登录代理。然后用 --proxy-server=http://127.0.0.1:8080 启动 Chrome,不带任何账号密码。用之前请核对你所用 gost 版本的参数写法。

    继续前请注意 务必绑定 127.0.0.1,不要绑所有地址,否则同一网络里的其他机器能用你的代理登录。

  4. 第 4 步:在 headless 浏览器里打印出口 IP

    运行下面的 Python 测试。页面能打开不能说明什么,因为 Chrome 可能是直连出去的。只有打印出的 IP 才是真实路径,应当和第 1 步 curl 的结果一致。

    预期结果 打印的 IP 和 curl 的一致。

测通登录并启动转发器

# 1) test the login outside the browser (HTTP port)
curl -x http://LOGIN:PASSWORD@HOST:2222 https://ipinfo.io/json

# 2) local forwarder: Chrome connects here without a login
gost -L http://127.0.0.1:8080 -F http://LOGIN:PASSWORD@HOST:2222

仅为示例:把 LOGIN、PASSWORD、HOST 换成「我的资产」里的值;登录名或密码里的 @ 等特殊字符要用百分号编码(@ 写成 %40)。

打印出口 IP 的 Selenium 测试

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By

options = Options()
options.add_argument("--headless=new")
# the local forwarder from step 3: no login in this address
options.add_argument("--proxy-server=http://127.0.0.1:8080")

driver = webdriver.Chrome(options=options)
try:
    driver.get("https://ipinfo.io/json")
    print(driver.find_element(By.TAG_NAME, "body").text)
finally:
    driver.quit()

仅为示例。需要 Chrome 和版本匹配的 chromedriver(或 Selenium Manager)。如果打印的是你自己的 IP,说明 Chrome 没有走代理。

还是不行怎么办

有界面正常,headless 显示的是自己的 IP

检查 有界面那次的代理从哪来:系统代理、扩展还是浏览器配置?

处理 在 headless 里用 --proxy-server 明确指定代理,并像第 4 步那样打印 IP;不要依赖只存在于你桌面上的设置。

出现 ERR_PROXY_CONNECTION_FAILED 或 ERR_TUNNEL_CONNECTION_FAILED

检查 第 1 步的 curl 通不通,转发器是否还在运行?

处理 先改 host、端口和协议(HTTP,2222 端口)。代理连接失败那篇按顺序列了排查项。

出现 407,或看到的是登录页而不是目标网站

检查 --proxy-server 地址里是不是还带着账号密码?

处理 从地址里去掉,交给转发器去发;Chrome 会忽略嵌入的登录信息。

长脚本中途出口 IP 变了

检查 是不是轮换线路?每个新连接换一个 IP。

处理 需要一直用同一个 IP 的任务,改用静态 IP,或在动态线路里开会话。

用 Proxy302 时

网关的 HTTP 端口是 2222,SOCKS5 端口是 3333。Selenium 驱动 Chrome 请用 HTTP。轮换住宅线路每个新连接换一个 IP,用于很多互不相关的页面加载;需要固定出口的测试,静态 ISP IP 在租期内不轮换,1 天 US$0.50,30 天 US$7.99。

没有免费试用,最小的购买是一个 IP 一天,或 1 GB 的轮换住宅流量。

常见问题

headless Chrome 会忽略代理吗?

按设计不会。Chrome 现在只有统一后的 headless 模式,--proxy-server 在里面和普通窗口一样生效。不同的是代理的来源,以及谁来回答登录框,所以同一份脚本表现会不一样。

该写 --headless 还是 --headless=new?

Selenium 文档把 --headless=new 列为常用的 Chrome 参数,Chrome 文档说 --headless 运行的就是统一后的模式。新版 Chrome 两种写法都行;旧模式现在只存在于 chrome-headless-shell。

Selenium 里能把账号密码写进代理地址吗?

Chrome 不行,它不使用嵌在代理设置里的账号密码。请用本地转发器替你加上登录,见第 3 步。

怎么确认浏览器真的在用代理?

在同一个 headless 会话里打开一个查 IP 的页面,把打印的 IP 和 curl 的结果比对。页面能打开不算证明。

selenium-wire 现在还能用吗?

它的仓库已于 2024 年 1 月 3 日归档,页面写明不再维护。老环境里也许还能跑,但新项目用本地转发器更容易长期维持。

参考资料

8
  1. Chromium 文档:Chrome 的代理支持

    官方文档 · 确认日期:

    2026 年 11 月 13 日阅读:Chrome 不使用嵌在代理设置里的账号密码,代理认证走常规的凭据查找流程;Chrome 不支持任何 SOCKSv5 认证方式;使用 HTTP 代理时域名解析交给代理。

  2. Chromium 文档:网络设置

    官方文档 · 确认日期:

    2026 年 11 月 13 日阅读:Chromium 网络栈使用系统网络设置,其中包括代理设置;--proxy-server 可写单个地址或按协议的映射,--proxy-bypass-list 只在与 --proxy-server 一起使用时才有效。

  3. Chrome for Developers:Chrome Headless 模式

    官方文档 · 确认日期:

    2026 年 11 月 13 日阅读:Chrome 已统一 Headless 与有界面模式,--headless 参数运行的就是统一后的模式;自 Chrome 132.0.6793.0 起,旧 Headless 模式只以独立的 chrome-headless-shell 提供。

  4. Selenium 文档:Chrome 浏览器选项

    官方文档 · 确认日期:

    2026 年 11 月 13 日阅读:常用 Chrome 参数包括 --start-maximized、--headless=new 和 --user-data-dir;Chrome 与 chromedriver 的主版本号必须一致。

  5. Selenium 文档:驱动选项(代理)

    官方文档 · 确认日期:

    2026 年 11 月 13 日阅读:Python 示例用 options.proxy = Proxy({'proxyType': ProxyType.MANUAL, 'httpProxy': 'http.proxy:1234'}) 设置代理,Proxy 和 ProxyType 来自 selenium.webdriver.common.proxy。

  6. selenium-wire 仓库

    官方文档 · 确认日期:

    2026 年 11 月 13 日阅读:仓库已于 2024 年 1 月 3 日由所有者归档,页面写明 Selenium Wire 不再维护;其 README 说明可在代理地址里写用户名和密码做 HTTP Basic 认证。

  7. GOST 文档:转发链

    官方文档 · 确认日期:

    2026 年 11 月 13 日阅读:页面给出 gost -L http://:8080 -F https://192.168.1.1:8080 形式的命令,-L 是本地服务,每个 -F 是转发链上的一跳。-F 地址里写账号密码沿用同样的 URL 写法,请按你的 gost 版本核对。

  8. Proxy302 产品信息与价格表

    产品观察 · 确认日期:

    站点产品信息表(价格按美元,1 PTC = 1 美元;协议与端口、租期;2026 年 11 月 4 日协议实测、11 月 10 日动态机房线路实测),2026 年 11 月 13 日核对。

准备好试试了吗?

注册账号、充值一次,就能选动态住宅、静态 ISP 或数据中心 IP,几分钟配进你的浏览器。