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

SeleniumBase驱动多线程处理5万+链接问题求助

解决SeleniumBase并发处理链接时的驱动实例分配异常问题

你的核心需求是每个链接对应一个独立的SeleniumBase Driver实例,之前用多线程方案失败,本质是Selenium基于浏览器进程的特性,多线程环境下容易出现资源竞争、实例复用混乱的问题。改用多进程方案可以彻底避免这类问题,因为每个进程拥有独立的内存空间,驱动实例完全隔离。

解决方案步骤

  1. 使用concurrent.futures.ProcessPoolExecutor替代线程池,实现真正的实例隔离
  2. 确保每个任务执行完毕后强制关闭驱动,避免资源泄漏
  3. 控制并发数,根据机器配置合理设置(避免因进程过多耗尽系统资源)
  4. 增加异常捕获,防止单个任务失败导致整个并发流程中断

修改后的完整代码

from seleniumbase import Driver
from concurrent.futures import ProcessPoolExecutor, as_completed
import traceback

def initialize_driver():
    # 每个进程初始化独立的驱动实例
    driver = Driver(
        uc=True,
        incognito=True,
        proxy='username:password@ip:port',
        headless=True
    )
    return driver

def process_link(link):
    driver = None
    result = {"link": link, "status": "failed", "data": None}
    try:
        driver = initialize_driver()
        # --------------------------
        # 这里替换你原有的业务逻辑代码
        # 例如:打开链接、操作页面、收集数据等
        driver.get(link)
        # 示例:获取页面标题作为数据
        result["data"] = {"title": driver.title}
        result["status"] = "success"
        # --------------------------
    except Exception as e:
        result["error"] = str(e)
        result["traceback"] = traceback.format_exc()
    finally:
        # 无论成功失败,都强制关闭驱动
        if driver:
            try:
                driver.quit()
            except:
                pass
    return result

def contact_agent():
    leads_list = get_leads()  # 假设这个函数返回你的5万+链接列表
    data_list = []
    # 根据CPU核心数和机器性能设置并发数,建议4-8,避免资源耗尽
    max_workers = 6

    with ProcessPoolExecutor(max_workers=max_workers) as executor:
        # 提交所有任务
        futures = {executor.submit(process_link, link): link for link in leads_list}
        # 遍历完成的任务,收集结果
        for future in as_completed(futures):
            link = futures[future]
            try:
                result = future.result()
                data_list.append(result)
                # 可选:打印进度
                print(f"处理完成: {link} | 状态: {result['status']}")
            except Exception as e:
                print(f"任务提交失败: {link} | 错误: {str(e)}")
                data_list.append({"link": link, "status": "submit_failed", "error": str(e)})
    
    return data_list

关键注意事项

  • 并发数设置:不要盲目调大,Windows系统建议不超过8,Linux可根据CPU核心数适当增加(比如核心数*2),否则会导致浏览器进程过多,内存、CPU占用过高,反而降低效率
  • 代理旋转:如果你的代理需要每次请求更换IP,需要修改initialize_driver函数,每次初始化驱动时获取新的代理地址(比如调用代理API),确保每个驱动实例用不同的代理
  • 资源监控:处理5万条链接时,建议定期监控系统资源(内存、CPU),如果出现资源耗尽,及时降低并发数
  • 异常处理:代码中增加了多层异常捕获,确保单个链接处理失败不会影响其他任务,同时保留错误信息便于排查

内容的提问来源于stack exchange,提问作者Ismail Amouma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 20:05:16