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
相关产品推荐
相关产品推荐

