使用Selenium结合Anticaptcha API填充reCAPTCHA后无法提交响应的技术求助
解决reCAPTCHA验证响应提交失败的问题
看起来你已经成功通过Anticaptcha拿到了reCAPTCHA的验证响应,但在提交环节踩了几个常见的坑,我来帮你梳理并修正:
核心问题分析
- 错误地刷新页面:填充完响应后直接调用
driver.refresh()会完全重置页面状态,之前写入的验证响应会被清空,自然无法触发后续跳转。 - 未切回主页面上下文:你一开始切换到了reCAPTCHA的iframe,但后续操作主页面元素时没有切回主文档,导致脚本根本找不到目标元素。
- 仅获取元素变量未执行提交动作:你只是定义了
captchaSubmitEl变量,但没有调用点击或提交方法,相当于找到了元素却没触发它的核心功能。
修正后的实现代码
下面是调整后的完整代码,我标注了关键修复点:
# 完成验证码任务后,先切回主页面上下文(因为之前切换到了reCAPTCHA的iframe) driver.switch_to.default_content() # 获取验证响应并填充到隐藏的input字段 response = job.get_solution_response() # 注意:部分页面用innerHTML,部分用value,两种写法都可以尝试 driver.execute_script("document.getElementById('g-recaptcha-response').value='{}';".format(response)) # 备选写法:driver.execute_script("document.getElementById('g-recaptcha-response').innerHTML='{}';".format(response)) # 触发reCAPTCHA的官方验证回调 # reCAPTCHA本身需要确认响应有效性,调用grecaptcha.submit()会启动验证流程 driver.execute_script("if (typeof grecaptcha !== 'undefined') { grecaptcha.submit(); }") # 等待验证完成(生产环境建议用WebDriverWait替代time.sleep,更稳定) import time time.sleep(2) # 触发页面的提交按钮 submit_btn = driver.find_element_by_id('captcha-submit') submit_btn.click()
额外优化建议
- 恢复site_key自动提取:你注释掉了通过正则从url中提取site_key的代码,建议恢复这部分逻辑,这样代码能适配页面site_key变化的场景,不用硬编码。
- 使用显式等待提升稳定性:替换
time.sleep()为WebDriverWait,比如等待提交按钮可点击,能避免网络延迟导致的元素未加载问题:from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, 'captcha-submit'))).click() - 适配自定义回调场景:有些网站会给reCAPTCHA绑定自定义回调函数(在
data-callback属性中),如果grecaptcha.submit()无效,可以尝试调用这个自定义回调:# 获取页面绑定的自定义回调函数名 callback_name = driver.find_element_by_class_name('g-recaptcha').get_attribute('data-callback') driver.execute_script("{}();".format(callback_name))
内容的提问来源于stack exchange,提问作者Muhammad Danial
相关产品推荐
相关产品推荐

