You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者吴志昊

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 18:10:25