ddddocr可识别简单验证码但对扭曲、干扰、粘连效果差;纯cpu运行,轻量集成;需显式指定model_dir避免重复下载;old=false才支持中文;裁剪边距有效,禁用全局二值化。

ddddocr 能直接识别大多数简单验证码,但对扭曲严重、背景干扰强或字符粘连的图效果有限;它不依赖 GPU,纯 CPU 运行快,适合轻量级爬虫集成。
安装与基础调用:别跳过 model\_dir 参数
pip install ddddocr 安装后,直接 import ddddocr 会默认下载模型到临时目录,多次运行可能重复拉取或权限失败。建议显式指定本地路径:
- 用
ddddocr.DdddOcr(model_dir="./models")初始化,确保模型只下载一次 - 首次运行时若报
FileNotFoundError: xxx/number.dnn,说明模型未就绪,需等自动下载完成(约 10–30 秒),或手动从ddddocrGitHub releases 页面下载models.zip解压到指定目录 - 不传
model_dir且网络受限时,程序会卡在模型加载,无明确超时提示
识别中文/数字混合验证码:必须关闭 old
ddddocr 默认启用 old=True 模式(兼容老版 OCR),但该模式仅支持英文+数字,遇到中文直接返回空字符串。关键操作是:
- 初始化时强制设
old=False:ocr = ddddocr.DdddOcr(old=False, model_dir="./models") -
old=False才启用新版 CNN 模型,支持中、英、数、常见符号(如+、=) - 若仍识别不出中文,检查图片是否已转为 RGB 模式(
img = img.convert("RGB")),灰度图可能被误判
预处理图像提升识别率:裁剪比二值化更有效
ddddocr 内部已做基础增强,额外预处理不当反而降低准确率。实测有效的操作只有:
- 用
PIL.Image裁掉验证码周边固定边距(如 2px 黑框),img = img.crop((2, 2, w-2, h-2)) - 避免全局二值化(
img.point(lambda x: 0 if x ),易丢失笔画细节;如需降噪,改用小半径高斯模糊(<code>img.filter(ImageFilter.GaussianBlur(radius=0.3))) - 输入尺寸建议保持原始大小(常见 100×40 或 120×50),缩放可能导致字符断裂,
ocr.classification()对分辨率敏感
绕过识别失败:加 fallback 逻辑别硬刚
单张图识别失败是常态,尤其目标站动态更换字体或加干扰线。不要循环重试,应设计降级路径:
- 设置最大尝试次数(如 3 次),每次换新 session 获取验证码图
- 识别结果长度异常(如返回空、超长、含不可见字符 \u200b)时,直接触发备用方案:人工打码接口(如超级鹰)、或切换代理重试
- 记录失败样本到本地(
img.save(f"fail_{int(time.time())}.png")),后续批量喂给自训练模型,比调参更治本
真正难的不是调通 ddddocr,而是识别结果不可靠时系统怎么稳住——多数崩溃发生在没设超时、没清 session、或把识别失败当异常抛出而不是业务分支处理。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











