在自动化测试或网页爬取中,识别验证码是常见的难点。Selenium 本身不具备直接识别验证码的能力,但可以通过结合第三方工具、OCR 技术或人工介入等方式解决。以下是多种可行方案的详细实现思路及代码示例:
一、方案一:使用第三方验证码识别服务(最推荐)
原理
通过 API 将验证码图片发送给专业识别平台,平台返回识别结果,适用于复杂验证码(如扭曲文字、点选式等)。
常用平台
- 打码平台:超级鹰、云打码、快识别等(需注册账号获取 API 密钥)。
- AI 识别服务:Google Cloud Vision、百度 AI 开放平台、腾讯云 OCR 等(适合企业级应用)。
代码示例(以超级鹰为例)
python
运行
from selenium import webdriver
import requests
import base64
import time# 1. 初始化浏览器
driver = webdriver.Chrome()
driver.get("需要验证码的网页URL")# 2. 截取验证码图片
def get_captcha(driver, element_id):# 定位验证码元素并截图captcha_element = driver.find_element_by_id(element_id)captcha_element.screenshot("captcha.png")return "captcha.png"# 3. 调用超级鹰API识别
def recognize_captcha(image_path, app_id, app_key, soft_id):# 读取图片并转base64with open(image_path, "rb") as f:image_data = base64.b64encode(f.read())# 构造请求参数url = "http://api.chaojiying.com/Upload/Processing.php"data = {"user": app_id,"pass2": app_key,"softid": soft_id,"codetype": "1004", # 验证码类型,1004代表数字+英文"file": image_data}# 发送请求response = requests.post(url, data=data)return response.json()["pic_str"] # 返回识别结果# 4. 主流程
if __name__ == "__main__":# 超级鹰账号信息(需自行注册)APP_ID = "你的AppID"APP_KEY = "你的AppKey"SOFT_ID = "你的SoftID"# 截取验证码img_path = get_captcha(driver, "captcha_img") # 假设验证码元素ID为captcha_img# 识别验证码captcha_text = recognize_captcha(img_path, APP_ID, APP_KEY, SOFT_ID)print("识别结果:", captcha_text)# 输入验证码并提交driver.find_element_by_id("captcha_input").send_keys(captcha_text)driver.find_element_by_id("submit_btn").click()time.sleep(3)driver.quit()
二、方案二:使用 OCR 库本地识别(适合简单验证码)
原理
通过 Python 的 OCR 库(如 Pillow、Tesseract)对图片进行文字识别,适合无干扰的纯文字验证码。如下面这个验证码:
实现步骤(1,2步骤可以参考文章selenium识别条形验证码,pytesseract下载、配置环境变量-CSDN博客)
- 安装 Tesseract OCR 引擎(需下载本地安装包)
- 安装 Python 绑定库
pytesseract
- 截图验证码并识别
代码示例
python
运行
from selenium import webdriver
from PIL import Image
import pytesseract
import time# 1. 配置Tesseract路径(Windows需修改此处)
pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"# 2. 初始化浏览器
driver = webdriver.Chrome()
driver.get("http://example.com/captcha_page") # 替换为实际网址# 3. 截取验证码并识别
def recognize_captcha(driver, element_id):# 定位元素并截图captcha_element = driver.find_element_by_id(element_id)captcha_element.screenshot("captcha.png")# 打开图片并识别image = Image.open("captcha.png")# 可选:预处理图片(灰度化、去噪点)image = image.convert("L") # 灰度化captcha_text = pytesseract.image_to_string(image, lang="eng+chi_sim")return captcha_text.strip() # 去除空格和换行# 4. 主流程
if __name__ == "__main__":# 假设验证码元素ID为captcha_imgcaptcha_text = recognize_captcha(driver, "captcha_img")print("识别结果:", captcha_text)# 输入验证码driver.find_element_by_id("captcha_input").send_keys(captcha_text)driver.find_element_by_id("submit_btn").click()time.sleep(3)driver.quit()
三、方案三:人工介入(临时解决方案)
适用场景
- 开发测试阶段,不想耗费时间集成识别服务
- 验证码过于复杂(如滑动拼图、点选图标等)
代码实现
python
运行
from selenium import webdriver
import timedriver = webdriver.Chrome()
driver.get("需要验证码的网页")# 1. 截图并提示人工输入
driver.save_screenshot("page_with_captcha.png")
print("请查看截图'page_with_captcha.png',并输入验证码:")
captcha_text = input() # 等待用户手动输入# 2. 提交验证码
driver.find_element_by_id("captcha_input").send_keys(captcha_text)
driver.find_element_by_id("submit_btn").click()time.sleep(3)
driver.quit()
四、方案四:规避验证码(进阶技巧)
1. 使用 Cookie 绕过验证
- 原理:提前登录并保存 Cookie,后续通过 Selenium 加载 Cookie 跳过验证码页面
- 代码示例:
python
运行
# 提前登录并获取Cookie(手动操作一次) driver.get("登录页") # 手动输入账号密码和验证码,登录成功后 cookies = driver.get_cookies() # 保存Cookie到文件 import json with open("cookies.json", "w") as f:json.dump(cookies, f)# 后续使用Cookie跳过验证 driver.get("目标页") with open("cookies.json", "r") as f:cookies = json.load(f) for cookie in cookies:driver.add_cookie(cookie) driver.refresh() # 刷新页面即可免登录
2. 模拟人类行为减少验证触发
- 避免机械化操作(如设置随机延迟、模拟鼠标移动轨迹)
- 示例:
python
运行
import random # 随机延迟0.5-2秒 time.sleep(random.uniform(0.5, 2)) # 模拟鼠标移动(非直线点击) from selenium.webdriver import ActionChains element = driver.find_element_by_id("button") actions = ActionChains(driver) actions.move_to_element_with_offset(element, random.randint(-10, 10), random.randint(-10, 10)) actions.click().perform()
五、各方案对比与选择建议
方案 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
第三方识别服务 | 准确率高,支持复杂验证码 | 需付费,依赖网络 | 生产环境、商业项目 |
本地 OCR 识别 | 免费,部署简单,新人学习 | 准确率低,需图片预处理 | 简单文字验证码、测试环境 |
人工介入 | 100% 准确,无需技术开发 | 无法自动化,效率低 | 临时任务、开发调试 |
规避验证码 | 高效,无需识别 | 需提前登录,适用性有限 | 已知可绕过的固定场景 |
六、验证码识别优化技巧
- 图片预处理:
- 灰度化、二值化处理(去除背景干扰)
- 降噪点(使用 PIL 的
filter(ImageFilter.MedianFilter)
)
- 指定识别语言:
- Tesseract 通过
lang="eng"
(英文)或lang="chi_sim"
(简体中文)提高准确率
- Tesseract 通过
- 结合机器学习:
- 若验证码样式固定,可收集样本训练自定义 OCR 模型(如使用 TensorFlow 或 PyTorch)
通过以上方案,可根据验证码复杂度和项目需求选择合适的识别方式。对于生产环境,优先考虑第三方服务(如超级鹰)或企业级 AI 接口(如百度 OCR),以保证稳定性和准确率;测试阶段可先用人工介入或本地 OCR 快速验证流程。