Python中使用Selenium实现机器人同步执行多组操作的方案咨询
Selenium多并发表单填报方案
实现方案
这个需求完全可落地,优先选择 concurrent.futures.ProcessPoolExecutor 进程池方案,原因是Selenium的每个浏览器实例都是独立进程,Python多线程受GIL限制不适合这种场景,进程池可以完美实现多个浏览器并行执行任务,也不需要额外修改原有业务逻辑。
如果你的人员数据量较小(比如10条以内),可以直接设置并发数等于数据量,实现同时启动对应数量的浏览器;如果数据量更大,建议限制最大并发数,避免资源耗尽。
核心实现步骤
- 把原有单用户的填报逻辑封装成独立函数,入参为单条人员数据,函数内部独立完成WebDriver初始化、代理配置、表单填报、驱动销毁全流程,不要跨任务复用WebDriver实例,避免数据串扰
- 调用进程池的批量任务提交方法,把所有人员数据依次传入,进程池会自动调度空闲进程执行任务
注意事项
- 资源消耗控制:单个Chrome实例默认占用100M-500M内存,10个并发大概会占用2G-4G内存,如果并发数超过20,一定要设置
max_workers上限,通常设置为CPU核心数的2-3倍即可,或者根据本机内存配置调整,避免内存不足导致进程崩溃 - 代理配置隔离:每个WebDriver实例要单独配置对应用户的代理,不要使用全局代理设置,避免不同进程的代理配置互相覆盖;如果是需要身份认证的代理,要给每个实例单独传入认证信息
- 反爬规避:如果目标网站有反爬机制,短时间内大量同特征的浏览器请求容易被拦截,建议给每个WebDriver配置独立的UA,或在填报步骤中加入随机延迟,避免所有进程同时提交表单
- 资源回收:每个任务执行完成后必须调用
driver.quit(),而不是driver.close(),确保浏览器进程和对应的驱动进程完全退出,避免残留僵尸进程占用系统资源 - 数据隔离:不要在多个进程中共享可变变量,所有人员数据直接作为入参传给任务函数即可,不需要额外配置共享内存
代码示例
from concurrent.futures import ProcessPoolExecutor from selenium import webdriver def single_user_fill(user_data): # 初始化当前用户的浏览器配置 chrome_options = webdriver.ChromeOptions() # 配置对应用户的代理 chrome_options.add_argument(f'--proxy-server={user_data["proxy"]}') # 可根据需求添加其他配置,比如无头模式、UA配置等 driver = webdriver.Chrome(options=chrome_options) try: # 原有单用户表单填报逻辑,直接复用即可 driver.get("你的表单页面地址") # 表单输入、提交等操作省略 print(f"用户{user_data['id']}填报完成") finally: # 强制关闭驱动,避免资源残留 driver.quit() if __name__ == "__main__": # 你的人员数据列表 user_list = [ {"id": 1, "proxy": "http://127.0.0.1:8080", "name": "张三"}, # 更多用户数据 ] # 最大并发数,10条以内可以直接设为len(user_list),数据量大时建议限制不超过15 max_workers = min(10, len(user_list)) with ProcessPoolExecutor(max_workers=max_workers) as pool: pool.map(single_user_fill, user_list)
可行性说明
该方案是Selenium多任务并行的标准实现方案,完全可行,不需要引入额外的第三方依赖,原有业务逻辑可以几乎零修改复用,比手动维护多进程更稳定,也自带异常处理和进程调度能力,是当前场景下最高效的实现方式。
内容的提问来源于stack exchange,提问作者Andres De Innocentiis
相关产品推荐
相关产品推荐

