跳到正文

Selenium SOCKS5 账号密码代理:原因与解法

为什么 Chrome 里 SOCKS5 的账号密码到不了代理,以及怎样用一个本机小转发器让 Selenium 正常上网。

Chrome 为什么登不上 SOCKS5

SOCKS5 开头有一次握手:客户端列出自己会的登录方式,代理从中选一种。Chromium 的客户端只列一种,「无需认证」,代理选了别的方式就按错误处理。所以要求账号密码的代理会在页面加载之前就拒绝连接,写在地址里的账号密码根本没有发出去。

这是浏览器的限制,不是你的 Selenium 代码或密码写错了。curl 这类实现了账号密码方式的工具,用同一组账号密码就能通,这也是区分两种情况最快的办法。Chrome 和 Edge 的整体情况见这里链接的指南。

三种解决办法

三种解决办法
项目改什么适合注意
同一资产的 HTTP 地址Chrome 里用 http://主机:2222,再在 Selenium 里应答代理的登录单个浏览器,不用多起进程需要有办法应答代理登录,Selenium 配置页有写法;先确认你的资产支持 HTTP
本机转发器Chrome 连 socks5://127.0.0.1:端口,账号密码由转发器带任何 Selenium 版本、任何语言、同时开多个浏览器多一个要启动和关闭的进程;只监听 127.0.0.1
换工具Playwright 或 Puppeteer 在代理设置里直接填账号密码新项目Chromium 里仍然要用 HTTP 地址;已有 Selenium 用例要改写

来源:Chromium 源码和 Chromium SOCKS 文档,2026 年 11 月 13 日读取;协议和端口来自 Proxy302 产品事实文件。

本机转发器:5 步配置

  1. 第 1 步

    先用下面前一条 curl 在浏览器之外测账号密码。正常会输出带代理出口 IP 的 JSON。

    预期结果 输出带代理出口 IP 的 JSON。

  2. 第 2 步

    安装一个能转到带账号密码 SOCKS5 的转发器。示例用 gost,从 gost.run 的文档安装。

  3. 第 3 步

    像 gost 命令那样,在 127.0.0.1 上用一个空闲本地端口启动。再用后一条 curl 测试:这一步不需要账号密码。

    预期结果 和第 1 步相同的出口 IP。

  4. 第 4 步

    按 Python 示例,让 Selenium 启动的 Chrome 带上 --proxy-server=socks5://127.0.0.1:端口。

  5. 第 5 步

    在这个浏览器里打开 https://ipinfo.io/json,把 IP 和国家与第 1 步对比。测试结束后关掉转发器。

用 curl 测账号密码和转发器

# 1) The login itself, outside the browser (socks5h = the proxy resolves the host name)
curl -x socks5h://LOGIN:PASSWORD@HOST:PORT https://ipinfo.io/json

# 2) The local forwarder, with no login
curl -x socks5h://127.0.0.1:1080 https://ipinfo.io/json

仅作示例:把 HOST、PORT、LOGIN、PASSWORD 换成「我的资产」里复制的值。

启动转发器(gost 示例)

# Listen on 127.0.0.1 without a login, forward to the Proxy302 SOCKS5 endpoint with the login
gost -L socks5://127.0.0.1:1080 -F socks5://LOGIN:PASSWORD@HOST:PORT

仅作示例。只监听 127.0.0.1,账号密码就只能在本机使用;不要监听 0.0.0.0。

Selenium(Python)通过转发器上网

# pip install -U selenium    and install gost (see gost.run)
import socket, subprocess, time
from selenium import webdriver
from selenium.webdriver.common.by import By

LOCAL_PORT = 1080
forwarder = subprocess.Popen([
    "gost",
    "-L", f"socks5://127.0.0.1:{LOCAL_PORT}",            # what Chrome connects to, no login
    "-F", "socks5://LOGIN:PASSWORD@HOST:PORT",            # what the forwarder connects to, with login
])

for _ in range(50):                                       # wait until the local port is open
    try:
        socket.create_connection(("127.0.0.1", LOCAL_PORT), timeout=0.2).close()
        break
    except OSError:
        time.sleep(0.2)

options = webdriver.ChromeOptions()
options.add_argument(f"--proxy-server=socks5://127.0.0.1:{LOCAL_PORT}")
driver = webdriver.Chrome(options=options)
try:
    driver.get("https://ipinfo.io/json")
    print(driver.find_element(By.TAG_NAME, "body").text)  # the proxy's exit IP
finally:
    driver.quit()
    forwarder.terminate()

仅作示例:把 HOST、PORT、LOGIN、PASSWORD 换成「我的资产」里复制的值。

转发器别对外开放,另外留意 DNS

转发器只绑 127.0.0.1,不要绑所有网卡:谁能连上一个敞开的转发端口,谁就能用你的账号密码。测试结束就关掉进程,账号密码也别写进多人共用的脚本和日志。

用 socks5:// 地址时,Chrome 会让代理去解析网页的域名,但 Chromium 文档提醒,Chrome 里别的部分仍可能自己做 DNS 解析。如果你的测试在意 DNS 路径,请按那篇文档的说法加上 --host-resolver-rules 参数。

还是不行时

错误页:无法连接到代理服务器

检查 转发器没在运行,本地端口和 --proxy-server 里的不一致,或者端口被别的程序占了。

处理 运行后一条 curl。它失败就先修转发器;它成功就核对 Selenium 选项里的端口。

停止条件 如果前一条 curl 也失败就别再试了:问题出在主机、端口或账号密码,不在转发器。看「连接失败」那篇指南。

转发器能启动,但所有请求都失败

检查 -F 地址里的 HOST、PORT 或账号密码写错了,或者资产只支持 HTTP。

处理 对照「我的资产」。proxy.proxy302.com 上 SOCKS5 是 3333 端口,HTTP 是 2222 端口;用资产发放时的协议对应的地址。

页面能打开,但 ipinfo.io 显示的是你自己的 IP

检查 Chrome 没吃到这个参数,比如已有一个旧的 Chrome 进程在用同一个配置目录。

处理 关掉所有 Chrome 进程,换一个新的 --user-data-dir,并确认参数确实放进了传给 webdriver.Chrome 的选项里。

跑一次正常,反复跑就卡住

检查 上一次的转发器进程还占着端口。

处理 像示例那样在 finally 里调用 terminate(),或者每次运行换一个本地端口。

用 Proxy302 怎么做

想让登录后一直用同一个地址,买协议选 SOCKS5 的静态 ISP IP:租期内 IP 不轮换,1 天 US$0.50,30 天 US$7.99(折合约每天 US$0.27)。SOCKS5 在 proxy.proxy302.com 的 3333 端口。没有免费试用,最小的一笔是 1 个 IP 用 1 天。

转发器对 Proxy302 所有产品的用法都一样。协议请在购买页选好,因为每个资产只按一种协议发放。

在 Proxy302 的操作步骤

  1. 第 1 步

    打开静态 ISP 页面,选国家,协议选 SOCKS5,核对费用后用钱包付款。

  2. 第 2 步

    打开「我的资产」,复制主机、端口、用户名和密码。

  3. 第 3 步

    填进转发器命令的 -F 地址:socks5://LOGIN:PASSWORD@HOST:PORT。

  4. 第 4 步

    运行 Selenium 示例,用 https://ipinfo.io/json 确认出口。

Selenium SOCKS5 常见问题

Selenium 支持带账号密码的 SOCKS5 吗?

Chrome 里不支持。Chromium 的 SOCKS5 客户端只提供「无需认证」,账号密码到不了代理。请用 HTTP 地址或本机转发器。

为什么在 --proxy-server 里写 socks5://user:pass@host:port 不行?

Chrome 不会在 SOCKS5 握手里发送账号密码,要求登录的代理就会拒绝连接。把账号写进地址并不能给浏览器增加登录方式。

用转发器要改 Selenium 代码吗?

只改代理地址:把远程地址换成 --proxy-server=socks5://127.0.0.1:端口,其余测试代码不变。

转发器能同时给多个浏览器用吗?

可以。每个代理起一个转发器、用不同的本地端口;如果几个浏览器本来就该用同一个出口,也可以都连同一个转发器。

用 HTTP 地址是不是比转发器简单?

不用多起进程,但 Chrome 需要应答代理登录,Selenium 自己不会做这一步。Selenium 配置页有这条路线的写法。

参考资料

4
  1. Chromium source: socks5_client_socket.cc

    官方文档 · 确认日期:

    Read on 13 November 2026: the greeting Chromium sends is 05 01 00 (one method, "no authentication"); a reply that selects a different method is handled as an unexpected-auth error and the connection fails.

  2. Chromium: Configuring a SOCKS proxy server in Chrome

    官方文档 · 确认日期:

    Read on 13 November 2026: --proxy-server="socks5://myproxy:8080"; with it the host name of http and https URLs is resolved by the proxy server, not locally; other components of Chrome may issue DNS requests directly; --host-resolver-rules can block local resolution.

  3. GOST documentation: forwarding chain

    官方文档 · 确认日期:

    Read on 13 November 2026: every -F parameter on the command line adds one hop to the forwarding chain, e.g. gost -L http://:8080 -F https://192.168.1.1:8080; -L opens a local listener, see also the SOCKS page for gost -L socks5://user:pass@:1080.

    The page has no example with a login inside -F. The login-in-URL form shown here is the same user:pass@host form used for -L; confirm it with gost --help or the docs of the version you install.

  4. Proxy302 产品事实与价目表

    产品观察 · 确认日期:

    站点产品事实文件,2026 年 11 月 13 日对照控制台、后端和价目表核对:静态 ISP 按 IP 租赁价格(US$,1 PTC = US$1)、动态住宅低价线路每 GB 价格、proxy.proxy302.com 上 HTTP 2222 端口和 SOCKS5 3333 端口、各产品支持哪种协议、无免费试用。

准备好试试了吗?

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