基于Selenium Python的CSV表单提交脚本内存优化与Chrome适配咨询
解决方案
1. 复用Chrome实例优化内存占用
你当前代码每次循环都新建Chrome实例的核心原因是webdriver.Chrome()初始化逻辑放在了for循环内部,只需要将初始化逻辑移到循环外,每次提交完成后重新加载表单页面即可,优化后的代码示例如下:
#------------------------------------------------------------------------------- # Imports import csv import time from selenium import webdriver # 适配版本自动匹配的依赖(可选) # from selenium.webdriver.chrome.service import Service # from webdriver_manager.chrome import ChromeDriverManager #------------------------------------------------------------------------------- # 全局配置 FORM_URL = "替换为你的表单页面实际地址" # Chrome实例仅初始化1次(放在循环外) # 手动指定驱动的原有写法 driver = webdriver.Chrome(executable_path='./chromedriver') # 自动匹配版本的写法(配合webdriver-manager使用) # driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) #------------------------------------------------------------------------------- # 数据读取与自动化提交 with open('data.csv', 'r', encoding='utf-8') as csv_file: csv_reader = csv.reader(csv_file) for line in csv_reader: # 每次加载表单页面,重置表单状态 driver.get(FORM_URL) # 等待页面加载完成,可替换为显式等待提升效率 time.sleep(3) title_field = driver.find_element_by_xpath('//*[@id="TITLE"]') title_field.send_keys(line[0]) fname_field = driver.find_element_by_xpath('//*[@id="FIRSTNAME"]') fname_field.send_keys(line[1]) lname_field = driver.find_element_by_xpath('//*[@id="LASTNAME"]') lname_field.send_keys(line[2]) phone_field = driver.find_element_by_xpath('/html/body/div/div/div[5]/form/div[6]/div/div/div/div/div[1]/div[2]/input[2]') phone_field.send_keys(line[3]) mail_field = driver.find_element_by_xpath('//*[@id="EMAIL"]') mail_field.send_keys(line[4]) submit = driver.find_element_by_xpath('//*[@id="s-form"]/div[9]/div/button') submit.click() # 等待提交完成,避免未提交就进入下一轮处理 time.sleep(2) # 全部数据处理完成后关闭浏览器 driver.quit() #-------------------------------------------------------------------------------
如果表单提交后页面没有跳转到其他地址,也可以用driver.refresh()刷新页面代替driver.get(FORM_URL)重置表单。
2. ChromeDriver与Chrome版本兼容解决方案
推荐使用webdriver-manager工具解决版本适配问题,无需手动下载对应版本的ChromeDriver,工具会自动检测本地Chrome的版本,下载完全匹配的驱动文件。
- 安装命令:
pip install webdriver-manager - 代码修改参考上面注释中的驱动初始化写法,不需要再手动指定
executable_path参数。 - 打包exe注意事项:使用PyInstaller打包时添加参数
--collect-datas webdriver_manager即可避免依赖缺失,打包后的exe仅需要运行环境预先安装Chrome浏览器即可,无需额外携带ChromeDriver文件。
如果不想引入额外依赖,可手动匹配版本:ChromeDriver的主版本号需要和本地安装的Chrome主版本号完全一致,在Chrome设置的「关于Chrome」页面查看当前版本后,下载对应版本的ChromeDriver即可。
额外优化提示
Selenium 4.0+版本已弃用find_element_by_xpath这类方法,可替换为driver.find_element(By.XPATH, '路径')的写法,兼容性更强,需要额外导入依赖:from selenium.webdriver.common.by import By。
内容的提问来源于stack exchange,提问作者RawalD
相关产品推荐
相关产品推荐

