Selenium+Chrome爬虫动态切换代理IP实现方法(无需关闭浏览器)
Selenium运行时动态切换代理(无需重启浏览器)
核心思路
普通Selenium启动时配置的代理无法在运行中修改,要实现动态切换,需借助Chrome DevTools Protocol(CDP)的Network.setProxy方法,直接通过浏览器调试接口修改代理设置,无需重启浏览器。结合给定的proxy_index索引,可直接从预获取的代理列表中切换目标代理。
完整实现代码
import requests import json from selenium import webdriver from selenium.webdriver.chrome.options import Options # ---------------------- 获取代理列表(原代码) ---------------------- # API URL url = "https://api.docip.net/v1/get_openproxy?api_key=JB9jysZRRmPYwoq680rn4656c4345&num=1000&proxy_type=&country_type=&sort_type=2&ports=&unports=&areas=&unareas=&quchong=0&format=json" response = requests.get(url) proxies_list = [] if response.status_code == 200: data = json.loads(response.text) for item in data: # 转换为CDP所需的代理格式(host:port) proxies_list.append(item) else: print("Error: Unable to fetch data from API") proxy_index = 0 # ---------------------- Selenium动态切换代理实现 ---------------------- def init_chrome_driver(): """初始化Chrome浏览器(不预设代理)""" chrome_options = Options() # 可选:添加常用参数,如禁用图片、无头模式等 # chrome_options.add_argument("--headless=new") # chrome_options.add_argument("--disable-images") driver = webdriver.Chrome(options=chrome_options) return driver def switch_proxy(driver, proxy): """通过CDP动态切换代理""" if not proxy: # 切换回无代理模式 driver.execute_cdp_cmd( "Network.setProxy", { "proxySettings": { "mode": "direct" } } ) return host, port = proxy.split(":") driver.execute_cdp_cmd( "Network.setProxy", { "proxySettings": { "mode": "manual", "httpProxy": f"{host}:{port}", "httpsProxy": f"{host}:{port}", "bypassList": ["localhost", "127.0.0.1"] # 本地地址不走代理 } } ) # 启用网络监听(确保代理设置生效) driver.execute_cdp_cmd("Network.enable", {}) # ---------------------- 测试示例 ---------------------- if __name__ == "__main__": driver = init_chrome_driver() # 初始切换到第一个代理(proxy_index=0) if proxies_list: switch_proxy(driver, proxies_list[proxy_index]) print(f"已切换到代理:{proxies_list[proxy_index]}") # 验证IP driver.get("http://httpbin.org/ip") print("当前IP:", driver.page_source) # 运行中切换到下一个代理(proxy_index自增) proxy_index += 1 if proxy_index < len(proxies_list): switch_proxy(driver, proxies_list[proxy_index]) print(f"已切换到代理:{proxies_list[proxy_index]}") driver.get("http://httpbin.org/ip") print("当前IP:", driver.page_source) else: print("代理列表已耗尽") else: print("无可用代理") # 最后关闭浏览器(按需操作) # driver.quit()
关键说明
- 代理格式转换:原代码将代理封装为requests可用的字典格式,这里转换为
host:port字符串,适配CDP的参数要求。 - CDP方法调用:
Network.setProxy是核心,通过driver.execute_cdp_cmd执行,支持手动设置代理或切换回直连模式。 - proxy_index的使用:通过修改
proxy_index的值,直接从proxies_list中选取对应代理传入switch_proxy函数即可完成切换,无需重启浏览器。 - 注意事项:
- 部分代理可能失效,建议添加代理有效性检测逻辑(比如切换后访问验证页面,判断IP是否变更)。
- 如果代理需要用户名密码认证,需在
proxySettings中添加username和password字段。
内容的提问来源于stack exchange,提问作者吴志昊
相关产品推荐
相关产品推荐

