后一个会话显示的还是前一个会话的 IP
检查 旧浏览器或它的转发器还在运行,或者两个会话用了同一个配置目录。
处理 在 finally 里调用 driver.quit() 并结束转发器进程,并给每个会话单独的 --user-data-dir。
Selenium 能切换什么、不能切换什么,以及让每个会话各用一个代理的写法。
Selenium 文档里,代理设在 options 对象上(options.proxy,或者一个 Chrome 参数),然后才调用 webdriver.Chrome(),所有示例都是这样写的。这套写法里没有只改某个标签页的命令,也没有给正在运行的浏览器换代理的命令。实际上「换代理」就是「用另一个代理启动下一个会话」。
Chrome 自己有一个实验性的 DevTools 调用 Target.createBrowserContext,可以给新建的空 context 指定 proxyServer。它不在 Selenium 的接口里,我们没有测试过用 Selenium 的窗口命令去操作这样的 context,也不建议在它上面搭东西。Playwright 和 Puppeteer 则把按 context 设置代理做成了正常选项。
| 项目 | 怎么做 | 适合 | 注意 |
|---|---|---|---|
| 每个代理新开 driver | 退出浏览器,用另一个代理启动下一个 | 按顺序执行的任务,一个任务一个 IP | 每个会话有启动时间;每次用干净的配置目录 |
| 并行多个 driver | 同时开几个浏览器,各有自己的代理和本地端口 | 需要并排运行的任务 | 每个浏览器占内存;账号密码是 SOCKS5 时每个代理要一个转发器 |
| 动态网关 | 一个代理地址,每个新连接换一个 IP | 很多一次性请求,不想重启浏览器 | 不是按标签页切换:Chrome 会复用已有连接,见下文 |
| 按 context 设置代理 | Playwright 或 Puppeteer,代理设在 context 上 | 一个浏览器里跑很多隔离会话 | 要换工具;已有的 Selenium 用例还是看这篇 |
来源:Selenium 文档(driver 选项)、Chrome DevTools Protocol 和 Playwright 文档,2026 年 11 月 13 日读取;网关行为来自 Proxy302 产品事实文件。
# pip install -U selenium and install gost (see gost.run)
import socket, subprocess, tempfile, time
from selenium import webdriver
from selenium.webdriver.common.by import By
PROXIES = [ # one entry per IP, copied from My assets (SOCKS5 endpoints)
("HOST", "PORT", "LOGIN_1", "PASSWORD_1"),
("HOST", "PORT", "LOGIN_2", "PASSWORD_2"),
]
def start_forwarder(local_port, host, port, login, password):
proc = subprocess.Popen(["gost", "-L", f"socks5://127.0.0.1:{local_port}",
"-F", f"socks5://{login}:{password}@{host}:{port}"])
for _ in range(50):
try:
socket.create_connection(("127.0.0.1", local_port), timeout=0.2).close()
return proc
except OSError:
time.sleep(0.2)
proc.terminate()
raise RuntimeError("forwarder did not start")
def run_session(local_port, entry):
forwarder = start_forwarder(local_port, *entry)
options = webdriver.ChromeOptions()
options.add_argument(f"--proxy-server=socks5://127.0.0.1:{local_port}")
options.add_argument(f"--user-data-dir={tempfile.mkdtemp()}") # a clean profile per session
driver = webdriver.Chrome(options=options) # the proxy is fixed from here on
try:
driver.get("https://ipinfo.io/json")
print(entry[2], driver.find_element(By.TAG_NAME, "body").text)
finally:
driver.quit()
forwarder.terminate()
for i, entry in enumerate(PROXIES):
run_session(1080 + i, entry) # next proxy = next browser session
仅作示例:把 HOST、PORT、LOGIN、PASSWORD 换成「我的资产」里复制的值。Chrome 自己发不了 SOCKS5 账号密码,所以示例在每个代理前面放了一个本机转发器。
from selenium import webdriver
from selenium.webdriver.common.proxy import Proxy, ProxyType
proxy = Proxy()
proxy.proxy_type = ProxyType.MANUAL
proxy.socks_proxy = "127.0.0.1:1080" # the local forwarder, no login in the address
proxy.socks_version = 5
options = webdriver.ChromeOptions()
options.proxy = proxy # set before the browser starts
driver = webdriver.Chrome(options=options)
仅作示例:代理属于启动选项,对从这些选项启动的整个会话生效。
Proxy302 的动态住宅和动态机房代理不开会话时,是每个新连接换一个 IP,不是每个请求换:一直保持打开的连接(keep-alive)会继续用原来的 IP。Chrome 会复用已打开的连接,所以同一个浏览器里连续加载几个页面,可能一段时间内显示同一个 IP。
任务一定要换新 IP,就新开一个浏览器会话。需要长时间用同一个 IP,就用静态 IP,或者开一个你需要时长的会话。
先想清楚什么必须保持不变:一个任务一个 IP、一个账号一个 IP,还是每个请求一个新 IP。
一个任务或一个账号对应一个 IP:用静态 IP,一个 IP 开一个浏览器会话。每个会话用新配置目录,cookie 就不会混。
每个请求一个新 IP、不要求固定地址:用动态代理,并接受同一个浏览器里连接会被复用。
需要同时跑很多隔离会话:这部分改用支持按 context 设置代理的工具。
检查 旧浏览器或它的转发器还在运行,或者两个会话用了同一个配置目录。
处理 在 finally 里调用 driver.quit() 并结束转发器进程,并给每个会话单独的 --user-data-dir。
检查 Chrome 保持着一个已打开的连接,连接不关 IP 就不变。
处理 需要新 IP 时新开一个会话,或者每个会话用一个静态 IP。
检查 代理参数或 Proxy 对象没有传到创建 driver 的那个 options 里。
处理 检查传给 webdriver.Chrome 的 options,并先用 curl 测试代理。
停止条件 curl 走代理也失败,说明问题在地址或账号密码,不在 Selenium。
检查 Chromium 发不了 SOCKS5 账号密码。
处理 像示例那样前面放一个本机转发器,或者改用 HTTP 地址。
每个会话一个固定地址,可以用静态 ISP IP:1 天 US$0.50,30 天 US$7.99(折合约每天 US$0.27),租期内不轮换,一次最多买 100 个。要一批会变的 IP,用动态住宅低价线路,每 GB US$1.50。
Chrome 发不了 SOCKS5 账号密码,所以给 Selenium 填 HTTP 地址(2222 端口),或者在 SOCKS5 地址(3333 端口)前面放本机转发器。没有免费试用,最小的一笔是 1 GB 住宅流量或 1 个 IP 用 1 天。
打开静态 ISP 页面(或动态住宅页面),选国家和协议,核对费用后用钱包付款。
打开「我的资产」,给每个需要的 IP 复制主机、端口、用户名和密码。
每个会话一条,填进示例里的 PROXIES 列表。
运行后,在 https://ipinfo.io/json 上确认每个会话打印出不同的出口。
按 Selenium 文档里的选项,不能:代理在 driver 启动时设定。退出 driver,用新代理再启动一个。
正常的 Selenium 配置做不到,标签页共用浏览器的代理。请一个代理开一个浏览器,或者用支持按 context 设置代理的工具。
同时启动多个 driver,各自带自己的代理参数和单独的 --user-data-dir,比如放在不同线程或进程里。
不一定。新连接会换 IP,但 Chrome 会复用已打开的连接。要确保换 IP,就新开一个会话。
对 Selenium 是的。重启太慢的话,用 Playwright 或 Puppeteer,一个 context 可以有自己的代理。
官方文档 · 确认日期:
Read on 13 November 2026: the Python example builds ChromeOptions, sets options.proxy = Proxy({"proxyType": ProxyType.MANUAL, "httpProxy": "http.proxy:1234"}) and only then starts webdriver.Chrome(options=options); the examples contain no user:pass.
The visible part of the page does not state in so many words that the proxy cannot be changed after the session starts; this guide relies on the examples, where the proxy is always part of the options passed at start.
官方文档 · 确认日期:
Read on 13 November 2026 in the protocol JSON: createBrowserContext creates a new empty browser context, similar to an incognito profile; its parameters proxyServer ("similar to the one passed to --proxy-server") and proxyBypassList are marked experimental.
Not tested with Selenium window commands.
官方文档 · 确认日期:
Read on 13 November 2026: the SOCKS5 greeting Chromium sends is 05 01 00 (one method, "no authentication"), so a login cannot be passed to a SOCKS5 proxy from Chrome.
官方文档 · 确认日期:
Read on 13 November 2026: proxy can be set globally for the browser or for each browser context individually.
产品观察 · 确认日期:
站点产品事实文件,2026 年 11 月 13 日对照控制台、后端和价目表核对:静态 ISP 按 IP 租赁价格(US$,1 PTC = US$1)、动态住宅低价线路每 GB 价格、proxy.proxy302.com 上 HTTP 2222 端口和 SOCKS5 3333 端口、各产品支持哪种协议、无免费试用。
注册账号、充值一次,就能选动态住宅、静态 ISP 或数据中心 IP,几分钟配进你的浏览器。