Selenium ChromeDriver:如何不重启驱动设置代理IP?(自问自答)
提问:Selenium无头浏览器怎么不重启驱动就切换不同外部IP发请求?
解决方案
我们手里有一台带多个外部IP的服务器,折腾了几天终于找到不用重启Selenium驱动就能切换IP的方法——核心是在服务器上搭建专属本地代理,通过动态切换代理绑定的IP实现需求。
步骤1:在服务器上搭建多IP绑定的本地代理(以Nginx为例)
给每个外部IP配置一个独立的Nginx代理端口,比如服务器有IP1、IP2、IP3三个外部IP,对应开放8081、8082、8083端口,每个端口绑定一个专属外部IP。
简化的Nginx配置片段:
# 绑定IP1的代理端口8081 server { listen 8081; resolver 8.8.8.8; location / { proxy_pass $scheme://$host$request_uri; proxy_bind 1.2.3.4; # 替换为你的实际外部IP1 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } # 绑定IP2的代理端口8082 server { listen 8082; resolver 8.8.8.8; location / { proxy_pass $scheme://$host$request_uri; proxy_bind 5.6.7.8; # 替换为你的实际外部IP2 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
配置完成后重启Nginx生效:sudo systemctl restart nginx
步骤2:Selenium动态切换代理(Chrome无头浏览器为例)
利用Chrome DevTools Protocol(CDP)的Network.setProxy命令,无需重启浏览器即可动态修改代理设置,直接上代码示例:
from selenium import webdriver from selenium.webdriver.chrome.service import Service # 初始化无头浏览器,无需预先设置代理 service = Service('/path/to/chromedriver') options = webdriver.ChromeOptions() options.add_argument('--headless=new') driver = webdriver.Chrome(service=service, options=options) def switch_proxy(driver, proxy_host, proxy_port): # 通过CDP命令设置新代理 driver.execute_cdp_cmd('Network.setProxy', { 'proxyType': 'manual', 'httpProxy': f'{proxy_host}:{proxy_port}', 'httpsProxy': f'{proxy_host}:{proxy_port}' }) # 验证IP切换结果(可选) driver.get('https://api.ipify.org') print(f"当前出口IP: {driver.page_source}") # 切换到IP1对应的代理(服务器内网IP+8081端口) switch_proxy(driver, '192.168.1.100', 8081) # 执行业务操作,如页面爬取、表单提交等... # 切换到IP2对应的代理 switch_proxy(driver, '192.168.1.100', 8082) # 继续执行另一项业务操作... driver.quit()
关键注意事项
- 确保服务器的每个外部IP均可正常访问公网,且防火墙已放开对应的Nginx代理端口。
- 若使用Firefox浏览器,可通过
driver.profile.set_preference动态修改代理设置,逻辑一致,无需重启驱动。 - CDP命令是实现无需重启驱动切换IP的核心,直接绕过了传统方式中修改代理必须重启浏览器的限制。
内容的提问来源于stack exchange,提问作者Anton Slastuhin
相关产品推荐
相关产品推荐

