如何在Selenium爬虫中自动绕过验证码?实战方案咨询
解决Selenium自动化登录中的reCAPTCHA v2问题
一、从源头减少验证码触发的方法
通过优化浏览器环境和请求特征,降低被识别为机器人的概率,从而减少验证码出现的次数:
undetected-chromedriver:替换普通ChromeDriver,自动规避
window.navigator.webdriver等WebDriver特征检测,让浏览器更接近真实用户环境。
代码示例:from undetected_chromedriver import Chrome, ChromeOptions options = ChromeOptions() options.add_argument("--start-maximized") # 可选:禁用图片加载提升速度 # options.add_argument("--blink-settings=imagesEnabled=false") driver = Chrome(options=options) driver.get("目标登录页面URL") # 执行登录操作 driver.find_element("id", "username").send_keys("你的用户名") driver.find_element("id", "password").send_keys("你的密码") driver.find_element("id", "submit-btn").click()selenium-stealth:配合undetected-chromedriver使用,进一步抹除自动化痕迹(如修改User-Agent、WebGL信息、语言设置等)。
代码示例:from undetected_chromedriver import Chrome from selenium_stealth import stealth driver = Chrome() stealth(driver, languages=["zh-CN", "zh"], vendor="Google Inc.", platform="Win32", webgl_vendor="NVIDIA Corporation", renderer="NVIDIA GeForce GTX 1650/PCIe/SSE2", fix_hairline=True, ) driver.get("目标登录页面URL")高匿代理IP:使用静态住宅代理(避免数据中心代理),分散请求IP,降低单IP被标记的风险。
代码示例(undetected-chromedriver配置代理):from undetected_chromedriver import Chrome, ChromeOptions options = ChromeOptions() # 格式:http://用户名:密码@代理IP:端口 options.add_argument("--proxy-server=http://user:pass@123.45.67.89:8080") driver = Chrome(options=options) driver.get("目标登录页面URL")
二、第三方验证码识别服务的实战方案
集成第三方验证码服务是正式环境下绕过reCAPTCHA v2的可行方案,这类服务通过人工打码或AI识别完成验证,并通过API返回结果。
主流服务对比
| 服务名称 | 平均识别速度 | 每千次识别成本 | 支持的验证码类型 |
|---|---|---|---|
| 2Captcha | 10-30秒 | 0.5-1美元 | reCAPTCHA v2/v3、hCaptcha、FunCaptcha等 |
| Anti-Captcha | 8-25秒 | 0.6-1.2美元 | 主流验证码全覆盖,支持复杂类型 |
| SolveCaptcha | 15-35秒 | 0.4-0.9美元 | reCAPTCHA v2/v3、hCaptcha |
其中2Captcha性价比最高,文档友好,适合新手快速集成;Anti-Captcha速度略快但成本稍高;SolveCaptcha成本最低,但复杂验证码支持度有限。
2Captcha集成代码示例
- 先注册2Captcha账号,获取API密钥并充值少量测试资金;
- 安装依赖:
pip install 2captcha-python - 实战代码:
from undetected_chromedriver import Chrome from twocaptcha import TwoCaptcha import time # 初始化验证码客户端 api_key = "你的2Captcha API密钥" solver = TwoCaptcha(api_key) driver = Chrome() driver.get("目标登录页面URL") # 输入账号密码 driver.find_element("id", "username").send_keys("你的用户名") driver.find_element("id", "password").send_keys("你的密码") # 获取reCAPTCHA的sitekey和当前页面URL site_key = driver.find_element("xpath", '//div[@class="g-recaptcha"]').get_attribute("data-sitekey") page_url = driver.current_url # 提交验证码识别任务 try: result = solver.recaptcha(sitekey=site_key, url=page_url) captcha_response = result['code'] except Exception as e: print(f"验证码识别失败: {str(e)}") driver.quit() exit() # 将识别结果注入页面并提交 driver.execute_script(f'document.getElementById("g-recaptcha-response").innerHTML="{captcha_response}";') time.sleep(2) # 等待页面验证 driver.find_element("id", "submit-btn").click() # 验证登录状态 time.sleep(3) if "登录成功" in driver.page_source: print("登录成功") else: print("登录失败") driver.quit()
三、注意事项
- 合规风险:多数网站禁止自动化登录,使用前务必确认网站的用户协议和robots.txt规则;
- 模拟真实操作:添加合理的操作间隔(如输入账号后停顿1-2秒),避免过于机械的请求;
- 重试机制:给验证码识别添加重试逻辑,避免单次识别失败导致脚本终止。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

