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

Python Selenium多线程开启多浏览器批量访问URL问题求助

Selenium多线程启动多浏览器解决方案

核心错误原因

你现有代码的3个核心问题导致仅启动1个浏览器:

  • 线程target参数逻辑错误:target=check_all_urls(get_all_gdc_urls())是在主线程直接执行check_all_urls函数,并未将函数对象和参数传递给子线程,因此会先同步执行该函数打开1个浏览器,后续线程创建逻辑不会生效。
  • URL列表未拆分:如果未做拆分直接给所有线程传递完整URL列表,会出现5个浏览器重复执行全部2万条URL的问题,没有起到分摊任务的效果。
  • 函数入参不匹配:check_all_urls定义要求接收urls参数,但你创建线程时args传递的是线程编号,参数对应错误。
  • 额外逻辑错误:你原有代码中my_urls = ('\n'.join(''.join(el) for el in url))的拼接逻辑完全错误,单条URL不需要做拼接操作,直接传入driver.get即可。

修改后的可用代码

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import threading

def check_all_urls(urls):
    options = Options()
    options.headless = False
    # 每个子线程单独创建1个Chrome驱动实例,对应1个浏览器窗口
    driver = webdriver.Chrome(options=options)
    for url in urls:
        # 去掉原有错误的URL拼接逻辑,直接访问单条URL
        driver.get(url)
        # 这里可以补充你自己的页面校验逻辑
    # 任务执行完后关闭浏览器
    driver.quit()

if __name__ == '__main__':
    # 先一次性获取全部URL列表
    all_urls = get_all_gdc_urls()
    number_of_threads = 5
    # 计算每个线程处理的URL数量
    chunk_size = len(all_urls) // number_of_threads
    # 把URL列表拆分为5份
    url_chunks = [all_urls[i*chunk_size : (i+1)*chunk_size] for i in range(number_of_threads)]
    # 处理整除后剩余的URL,放到最后一个chunk里
    if len(all_urls) % number_of_threads != 0:
        url_chunks[-1].extend(all_urls[number_of_threads*chunk_size:])
    
    threads = []
    for i in range(number_of_threads):
        # 修正target传参:只传函数名,参数放到args元组里
        t = threading.Thread(target=check_all_urls, args=(url_chunks[i],))
        t.start()
        threads.append(t)
    
    # 等待所有线程执行完成
    for t in threads:
        t.join()

额外优化建议

  • 如果需要更高的执行效率,可以把options.headless设置为True启用无头模式,减少浏览器UI渲染的性能开销。
  • 可以添加异常捕获逻辑,避免单条URL访问出错导致整个线程崩溃。
  • 2万条URL建议添加请求间隔或者限流逻辑,避免触发目标站点的反爬机制。

内容的提问来源于stack exchange,提问作者Jack Gruber

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 04:24:03