如何动态修改Selenium WebDriver代理IP?可否借助JS插件实现?
Selenium WebDriver 代理IP动态修改实现方案
原有代码失效原因
你使用的JS代码调用的是火狐旧版XPCOM特权接口,仅支持在火狐扩展的特权上下文运行,直接通过Selenium的execute_script方法注入没有调用权限,因此完全不会生效。
正确实现方案
根据使用场景分为两类实现方式:
场景1:浏览器启动时设置静态代理
无需运行中修改代理的场景下,直接通过启动参数/配置文件设置即可,兼容性最好。
Chrome/Edge 实现
from selenium import webdriver from selenium.webdriver.common.proxy import Proxy, ProxyType proxy_host = "替换为你的代理IP" proxy_port = 替换为你的代理端口 # 方式1:通过Proxy类统一配置 proxy = Proxy() proxy.proxy_type = ProxyType.MANUAL proxy.http_proxy = f"{proxy_host}:{proxy_port}" proxy.ssl_proxy = f"{proxy_host}:{proxy_port}" proxy.ftp_proxy = f"{proxy_host}:{proxy_port}" options = webdriver.ChromeOptions() options.proxy = proxy driver = webdriver.Chrome(options=options) # 方式2:直接传入启动参数 options = webdriver.ChromeOptions() options.add_argument(f"--proxy-server=http://{proxy_host}:{proxy_port}") driver = webdriver.Chrome(options=options)
Firefox 实现
from selenium import webdriver profile = webdriver.FirefoxProfile() profile.set_preference("network.proxy.type", 1) profile.set_preference("network.proxy.http", "替换为你的代理IP") profile.set_preference("network.proxy.http_port", 替换为你的代理端口) profile.set_preference("network.proxy.ssl", "替换为你的代理IP") profile.set_preference("network.proxy.ssl_port", 替换为你的代理端口) profile.update_preferences() driver = webdriver.Firefox(firefox_profile=profile)
场景2:浏览器运行中动态切换代理(无需重启)
需要不重启浏览器更换代理的场景,Selenium 4+ 可通过CDP(Chrome DevTools Protocol)实现,无需额外安装插件。
Chrome/Edge 实现
def update_chrome_proxy(driver, proxy_host, proxy_port, bypass_list="localhost,127.0.0.1"): # 调用CDP接口设置代理规则 driver.execute_cdp_cmd("Network.setProxy", { "proxyRules": f"http={proxy_host}:{proxy_port};https={proxy_host}:{proxy_port};ftp={proxy_host}:{proxy_port}", "proxyBypassList": bypass_list }) # 清空cookie并刷新页面使新代理生效 driver.delete_all_cookies() driver.refresh() # 调用示例 update_chrome_proxy(driver, "192.168.1.1", 8080)
Firefox 实现
新版Firefox同样支持CDP协议,开启远程调试配置后即可使用上述相同的execute_cdp_cmd方法调用,仅需要在启动时额外添加配置:
options = webdriver.FirefoxOptions() options.set_preference("moz:debuggerAddress", True) driver = webdriver.Firefox(options=options)
注意事项
- 如果代理需要账号密码认证,Chrome/Edge无法直接通过命令行或CDP传入,需要额外打包一个小型扩展处理代理认证弹窗
- Selenium 3及以下版本不支持原生CDP调用,建议升级到Selenium 4+使用动态代理切换功能
内容的提问来源于stack exchange,提问作者code
相关产品推荐
相关产品推荐

