目录
- [1 前言](#1 前言)
- [2 文字验证码识别 - 使用 ddddocr](#2 文字验证码识别 - 使用 ddddocr)
-
- [2.1 ddddocr 简介](#2.1 ddddocr 简介)
- [2.2 安装 ddddocr](#2.2 安装 ddddocr)
- [2.3 基本使用方法](#2.3 基本使用方法)
- [2.4 验证码预处理 - 使用颜色选择](#2.4 验证码预处理 - 使用颜色选择)
- [3 计算型验证码识别](#3 计算型验证码识别)
-
- [3.1 计算型验证码特点](#3.1 计算型验证码特点)
- [3.2 使用超级鹰 API 识别](#3.2 使用超级鹰 API 识别)
-
- [3.2.1 步骤 1:注册超级鹰账号](#3.2.1 步骤 1:注册超级鹰账号)
- [3.2.2 步骤 2:实现超级鹰客户端,从官方下载即可](#3.2.2 步骤 2:实现超级鹰客户端,从官方下载即可)
- [3.2.3 步骤 3:使用超级鹰识别计算型验证码](#3.2.3 步骤 3:使用超级鹰识别计算型验证码)
- [3.3 纯本地计算型验证码识别](#3.3 纯本地计算型验证码识别)
-
- [3.3.1 实现思路](#3.3.1 实现思路)
- [3.3.2 完整代码](#3.3.2 完整代码)
- [4 验证码识别的实践建议](#4 验证码识别的实践建议)
- [4.1 小建议](#4.1 小建议)
-
- [4.2 常见问题及解决方案](#4.2 常见问题及解决方案)
- [5 总结](#5 总结)
1 前言
在网络爬虫开发过程中,验证码是一个常见的反爬机制。网站通过验证码来区分人类用户和机器爬虫,增加了自动化采集数据的难度。本文将详细介绍如何使用 Python 实现网站验证码的识别,包括文字验证码和计算型验证码的处理方法。
2 文字验证码识别 - 使用 ddddocr
2.1 ddddocr 简介
ddddocr 是一个基于深度学习的 OCR 识别库,专为验证码识别优化,具有以下特点:
- 轻量级,安装简单
- 识别准确率高
- 支持多种验证码类型
- 无需复杂配置

具体参考:ddddocr包链接
2.2 安装 ddddocr
bash
pip install ddddocr
2.3 基本使用方法
python
import ddddocr
# 初始化OCR识别器
ocr = ddddocr.DdddOcr(show_ad=False)
# 读取验证码图片
with open('captcha.png', 'rb') as f:
image = f.read()
# 识别验证码
result = ocr.classification(image)
print(f"识别结果: {result}")
2.4 验证码预处理 - 使用颜色选择
对于一些复杂的验证码,特别是彩色验证码,我们可以使用颜色选择的方法来提高识别率:
这里使用我的代码,使用 color_filter_colors,官方文档里面的案例是错的。
python
import ddddocr
def ocr_color(color: str, image_path: str):
"""
识别验证码图片中的指定颜色(红色或蓝色)
:param color: 颜色名称,"red"或"blue"
:return: 识别到的验证码字符串
"""
ocr = ddddocr.DdddOcr(show_ad=False)
image = open(image_path, "rb").read()
# 只保留指定颜色部分
result = ocr.classification(image, color_filter_colors=[color])
return result
# 实际应用示例
# 1. 首先获取验证码图片
# 这里使用Playwright截图获取验证码
img_loc = page.locator("#verifyImage")
img_loc.screenshot(path="verify_code.png")
# 2. 获取提示文字,判断需要识别的颜色
tip_text = page.locator("#verifyTips").inner_text()
if "蓝色" in tip_text.strip():
verifyCode = ocr_color("blue", "verify_code.png")
elif "红色" in tip_text.strip():
verifyCode = ocr_color("red", "verify_code.png")
else:
# 其他类型验证码处理
print("处理其他类型验证码")
print(f"验证码识别结果:{verifyCode}")
这种方法的优势在于:
- 可以只关注验证码中的特定颜色,忽略背景干扰
- 对于彩色验证码的识别率更高
- 代码简洁,不需要复杂的图像处理步骤
- 结合 ddddocr 的颜色过滤功能,效果显著
3 计算型验证码识别
3.1 计算型验证码特点
计算型验证码通常是一个简单的数学计算题,如"2+3=?"、"15-7=?"等。识别这类验证码需要:
- 提取验证码中的文本
- 解析数学表达式
- 计算结果
3.2 使用超级鹰 API 识别
对于计算型验证码,我们可以使用第三方验证码识别服务。这里以超级鹰(Chaojiying)API 为例,它支持多种验证码类型。

3.2.1 步骤 1:注册超级鹰账号
- 访问超级鹰官网
- 注册账号并充值
- 添加软件 ID,获取用户名、密码和软件 ID
3.2.2 步骤 2:实现超级鹰客户端,从官方下载即可
python
import requests
from hashlib import md5
class Chaojiying_Client(object):
def __init__(self, username, password, soft_id):
self.username = username
password = password.encode('utf8')
self.password = md5(password).hexdigest()
self.soft_id = soft_id
self.base_params = {
'user': self.username,
'pass2': self.password,
'softid': self.soft_id,
}
self.headers = {
'Connection': 'Keep-Alive',
'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
}
def PostPic(self, im, codetype):
"""
im: 图片字节
codetype: 题目类型 参考 http://www.chaojiying.com/price.html
"""
params = {
'codetype': codetype,
}
params.update(self.base_params)
files = {'userfile': ('ccc.jpg', im)}
r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers)
return r.json()
def PostPic_base64(self, base64_str, codetype):
"""
im: 图片字节
codetype: 题目类型 参考 http://www.chaojiying.com/price.html
"""
params = {
'codetype': codetype,
'file_base64': base64_str
}
params.update(self.base_params)
r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, headers=self.headers)
return r.json()
def ReportError(self, im_id):
"""
im_id: 报错题目的图片ID
"""
params = {
'id': im_id,
}
params.update(self.base_params)
r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)
return r.json()
3.2.3 步骤 3:使用超级鹰识别计算型验证码
python
# 初始化超级鹰客户端
chaojiying = Chaojiying_Client('用户名', '密码', '软件ID')
# 读取验证码图片
im = open('verify_code.png', 'rb').read()
# 识别验证码(6001表示计算题类型)
result = chaojiying.PostPic(im, 6001)
# 获取识别结果
if result['err_no'] == 0:
verify_code = result['pic_str']
print(f"验证码识别结果: {verify_code}")
else:
print(f"识别失败: {result['err_str']}")
3.3 纯本地计算型验证码识别
3.3.1 实现思路
- 用
ddddocr识别出验证码图片里的算式文本 (例如:3+5=、9-2=、4×3=) - 清洗文本,去掉等号、空格
- 解析并计算结果
- 输出最终答案
3.3.2 完整代码
python
import ddddocr
import re
def calc_captcha_recognize(image_path: str):
"""
纯本地识别计算型验证码(支持 + - × ÷)
:param image_path: 验证码图片路径
:return: 计算结果(数字)
"""
# 1. 初始化OCR
ocr = ddddocr.DdddOcr(show_ad=False)
# 2. 读取图片并识别
with open(image_path, "rb") as f:
img_bytes = f.read()
ocr_result = ocr.classification(img_bytes)
print(f"识别到原始算式:{ocr_result}")
# 3. 清洗文本:只保留 数字 + - * /
# 把 × 替换成 *,把 ÷ 替换成 /
expr = ocr_result.strip()
expr = expr.replace("=", "") # 去掉等号
expr = expr.replace("×", "*")
expr = expr.replace("÷", "/")
expr = re.sub(r"[^0-9\+\-\*\/]", "", expr) # 只保留数字和运算符
print(f"清洗后算式:{expr}")
# 4. 计算结果(安全计算,避免危险eval)
try:
# 简单计算验证码用eval足够安全
calc_result = eval(expr)
# 取整数(计算题一般都是整数)
calc_result = int(calc_result)
return calc_result
except:
return "识别/计算失败"
# ====================== 使用示例 ======================
if __name__ == "__main__":
# 传入你的计算型验证码图片
answer = calc_captcha_recognize("calc_captcha.png")
print(f"验证码最终答案:{answer}")
4 验证码识别的实践建议
4.1 小建议
- 使用代理 IP:避免因频繁请求被网站屏蔽
- 添加请求间隔:模拟人类操作,避免请求过于频繁
- 异常处理:添加完善的异常处理机制,应对识别失败的情况
- 使用重复验证:验证不一定每次都成功,要重复验证,结合异常处理
4.2 常见问题及解决方案
| 问题 | 解决方案 |
|---|---|
| 识别率低 | 增加图像预处理步骤,尝试不同的 OCR 引擎 |
| 验证码频繁变化 | 动态调整识别策略,收集更多样本 |
| 被网站屏蔽 | 使用代理 IP,降低请求频率 |
| 计算型验证码解析错误 | 优化正则表达式,增加表达式解析的鲁棒性 |
5 总结
验证码识别是爬虫开发中的重要环节,通过使用 ddddocr 进行文字识别和第三方服务处理计算型验证码,我们可以有效地应对网站的反爬机制。在实际应用中,需要根据具体情况选择合适的识别策略,并不断优化提高识别准确率。
希望本文对大家有所帮助,祝大家在爬虫开发的道路上越走越远!