跳到正文

Selenium 切换代理:每个会话还是每个标签页

Selenium 能切换什么、不能切换什么,以及让每个会话各用一个代理的写法。

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 产品事实文件。

每个代理一个干净会话(Python)

# 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 账号密码,所以示例在每个代理前面放了一个本机转发器。

用 Selenium 的 Proxy 类设置代理

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)

仅作示例:代理属于启动选项,对从这些选项启动的整个会话生效。

不新开浏览器怎么换 IP

Proxy302 的动态住宅和动态机房代理不开会话时,是每个新连接换一个 IP,不是每个请求换:一直保持打开的连接(keep-alive)会继续用原来的 IP。Chrome 会复用已打开的连接,所以同一个浏览器里连续加载几个页面,可能一段时间内显示同一个 IP。

任务一定要换新 IP,就新开一个浏览器会话。需要长时间用同一个 IP,就用静态 IP,或者开一个你需要时长的会话。

4 步选定做法

  1. 第 1 步

    先想清楚什么必须保持不变:一个任务一个 IP、一个账号一个 IP,还是每个请求一个新 IP。

  2. 第 2 步

    一个任务或一个账号对应一个 IP:用静态 IP,一个 IP 开一个浏览器会话。每个会话用新配置目录,cookie 就不会混。

  3. 第 3 步

    每个请求一个新 IP、不要求固定地址:用动态代理,并接受同一个浏览器里连接会被复用。

  4. 第 4 步

    需要同时跑很多隔离会话:这部分改用支持按 context 设置代理的工具。

常见问题

后一个会话显示的还是前一个会话的 IP

检查 旧浏览器或它的转发器还在运行,或者两个会话用了同一个配置目录。

处理 在 finally 里调用 driver.quit() 并结束转发器进程,并给每个会话单独的 --user-data-dir。

动态代理下,几次加载页面 IP 都不变

检查 Chrome 保持着一个已打开的连接,连接不关 IP 就不变。

处理 需要新 IP 时新开一个会话,或者每个会话用一个静态 IP。

每个会话显示的都是你自己的 IP

检查 代理参数或 Proxy 对象没有传到创建 driver 的那个 options 里。

处理 检查传给 webdriver.Chrome 的 options,并先用 curl 测试代理。

停止条件 curl 走代理也失败,说明问题在地址或账号密码,不在 Selenium。

带 SOCKS5 账号密码的代理在 Chrome 里失败

检查 Chromium 发不了 SOCKS5 账号密码。

处理 像示例那样前面放一个本机转发器,或者改用 HTTP 地址。

用 Proxy302 怎么做

每个会话一个固定地址,可以用静态 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 天。

在 Proxy302 的操作步骤

  1. 第 1 步

    打开静态 ISP 页面(或动态住宅页面),选国家和协议,核对费用后用钱包付款。

  2. 第 2 步

    打开「我的资产」,给每个需要的 IP 复制主机、端口、用户名和密码。

  3. 第 3 步

    每个会话一条,填进示例里的 PROXIES 列表。

  4. 第 4 步

    运行后,在 https://ipinfo.io/json 上确认每个会话打印出不同的出口。

Selenium 切换代理常见问题

正在运行的 Selenium 浏览器能换代理吗?

按 Selenium 文档里的选项,不能:代理在 driver 启动时设定。退出 driver,用新代理再启动一个。

Selenium 每个标签页能用不同的代理吗?

正常的 Selenium 配置做不到,标签页共用浏览器的代理。请一个代理开一个浏览器,或者用支持按 context 设置代理的工具。

Selenium 怎么同时用多个代理?

同时启动多个 driver,各自带自己的代理参数和单独的 --user-data-dir,比如放在不同线程或进程里。

动态代理每次加载页面都会换 IP 吗?

不一定。新连接会换 IP,但 Chrome 会复用已打开的连接。要确保换 IP,就新开一个会话。

重启浏览器是唯一办法吗?

对 Selenium 是的。重启太慢的话,用 Playwright 或 Puppeteer,一个 context 可以有自己的代理。

参考资料

5
  1. Selenium documentation: driver options, proxy

    官方文档 · 确认日期:

    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.

  2. Chrome DevTools Protocol: Target.createBrowserContext

    官方文档 · 确认日期:

    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.

  3. Chromium source: socks5_client_socket.cc

    官方文档 · 确认日期:

    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.

  4. Playwright: Network, HTTP proxy

    官方文档 · 确认日期:

    Read on 13 November 2026: proxy can be set globally for the browser or for each browser context individually.

  5. Proxy302 产品事实与价目表

    产品观察 · 确认日期:

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

准备好试试了吗?

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