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

如何在多线程中运行selenium-chromedriver实现多浏览器并行任务

问题根源

你出现的前一个浏览器停止运行的问题,核心原因是不同线程共用了同一个ChromeDriver实例:

  • 大概率你是将driver定义为类的共享属性,第二次启动线程初始化driver时,直接覆盖了第一个线程正在使用的driver引用,导致第一个线程的操作失去控制直接中断
  • 部分场景下也可能是你在selenium操作代码中误加了全局锁,导致多个线程的任务强制串行执行

解决方案

1. 每个线程单独初始化独立的Driver实例

在self.main方法内部初始化ChromeDriver,不要将driver设置为类的全局属性,保证每个线程的driver完全隔离,不会互相覆盖:

import threading
from selenium import webdriver

def main(self):
    # 每个线程内部单独创建driver,不要放在类初始化或者全局位置
    chrome_options = webdriver.ChromeOptions()
    # 可选配置:添加启动参数优化运行速度,提升执行效率
    chrome_options.add_argument("--headless=new") # 不需要可视化界面可以开启无头模式
    chrome_options.add_argument("--disable-gpu")
    chrome_options.add_argument("--disable-images") # 禁用图片加载,加快页面渲染
    chrome_options.add_argument("--disable-extensions")
    driver = webdriver.Chrome(options=chrome_options)
    
    # 后续所有selenium操作逻辑都用这个局部driver变量,不要用self.driver
    # ... 你的爬取、输入评论等业务逻辑 ...
    
    # 任务结束后关闭driver释放资源
    driver.quit()

def thread_(self):
    th = threading.Thread(target=self.main)
    th.start()

2. 额外效率优化建议

如果要进一步提升self.main的执行效率,你可以做以下配置:

  • 给ChromeDriver设置代理池,避免单IP被目标站点限制导致的阻塞等待
  • 对不需要操作的静态资源直接拦截,减少请求耗时
  • 合理设置页面加载超时时间,避免单页面卡住拖慢整个任务
  • 如果任务量较大,你可以用线程池替换手动创建线程的逻辑,避免线程频繁创建销毁的开销,示例如下:
from concurrent.futures import ThreadPoolExecutor

# 类初始化的时候创建固定大小的线程池,比如最大同时跑10个任务
def __init__(self):
    self.executor = ThreadPoolExecutor(max_workers=10)

def thread_(self):
    # 直接提交任务到线程池即可,自动复用线程
    self.executor.submit(self.main)

内容的提问来源于stack exchange,提问作者Flu_Py Developer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 18:18:03