求助:基于Selenium的Google Forms自动填充代码优化与排查
Google Forms 自动提交:问题排查与优化方案
原代码的关键问题
- 效率极低+反爬风险高:每次循环都重启Chrome,不仅速度慢到离谱,频繁的浏览器启停很容易被Google的反自动化机制盯上,轻则提交失败,重则直接限制访问。
- 元素定位不靠谱:
- 没加等待逻辑,页面还没加载完就去定位元素,十有八九会抛出
NoSuchElementException; - 用选项的显示文本去匹配
data-value是错误逻辑——Google Forms的data-value存的是选项的内部标识,和你看到的显示文本根本不是一回事,这会导致选项点不到。
- 没加等待逻辑,页面还没加载完就去定位元素,十有八九会抛出
- 提交流程不严谨:点完提交直接关浏览器,完全没确认提交是否成功,可能会出现提交半截就中断的情况。
优化后的代码实现
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import random import time # 注意:替换成你表单选项实际的data-value值(按F12查看元素属性) options = ["选项1的data-value值", "选项2的data-value值", "选项3的data-value值", "选项4的data-value值"] form_url = "https://docs.google.com/forms/d/e/1FAIpQLSe8Wj3QAV0LPYGPODkNCK_JSfoacBWUX_3Uq7gTlJB9icBgGQ/viewform" total_submissions = 100 # 初始化一次浏览器,全程复用实例 driver = webdriver.Chrome() wait = WebDriverWait(driver, 10) # 最长等待10秒 try: for idx in range(total_submissions): email = f"test{idx}@example.com" driver.get(form_url) # 等待邮箱输入框加载完成后输入内容 email_input = wait.until(EC.presence_of_element_located((By.NAME, "entry.1170127610"))) email_input.clear() email_input.send_keys(email) # 随机选择一个选项并点击 chosen_option = random.choice(options) option_btn = wait.until(EC.element_to_be_clickable((By.XPATH, f"//div[@data-value='{chosen_option}']"))) option_btn.click() # 等待提交按钮可点击后完成提交 submit_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//span[text()='提交']"))) submit_btn.click() # 等待提交成功提示出现,确保本次提交完成 wait.until(EC.presence_of_element_located((By.XPATH, "//div[contains(text(), '已提交')]"))) # 增加随机延迟,模拟真人操作节奏 time.sleep(random.uniform(1, 3)) print(f"第{idx+1}次提交完成") finally: # 无论执行结果如何,最终关闭浏览器释放资源 driver.quit()
核心优化说明
- 复用浏览器实例:只初始化一次Chrome,循环内仅刷新表单页面,效率至少提升10倍,同时大幅降低被反爬检测的概率。
- 显式等待替代无等待逻辑:用
WebDriverWait等待元素加载完成/可点击,彻底解决因页面加载延迟导致的元素定位失败问题。 - 修正选项定位逻辑:打开表单按F12查看选项元素的
data-value属性值,替换到options列表中,确保精准定位选项。 - 提交确认机制:等待提交成功的提示元素出现后再进入下一次循环,保证每一次提交都完整完成。
- 模拟真人操作:添加随机延迟,避免操作节奏过于机械触发反爬机制。
额外注意事项
- 提交100次大概率会触发Google的验证码验证,此时需手动处理或接入验证码识别工具(如Anti-Captcha)。
- 可启用Chrome无头模式减少资源占用,需注意无头模式也可能被检测,可搭配反检测参数:
chrome_options = webdriver.ChromeOptions() chrome_options.add_argument("--headless=new") chrome_options.add_argument("--disable-blink-features=AutomationControlled") driver = webdriver.Chrome(options=chrome_options)
内容的提问来源于stack exchange,提问作者Hồ Thánh
相关产品推荐
相关产品推荐

