1. 背景
在自动化测试、数据爬取或批量操作中,验证码常常是绕不过去的一道坎。传统OCR(光学字符识别)工具在面对带有干扰线、扭曲变形或背景噪点的验证码时,往往力不从心。而 ddddocr 则是一个专注于验证码识别的Python库,以其简单易用和高准确率赢得了不少开发者的青睐。本文将介绍如何快速上手 ddddocr 来识别常见的字符型验证码。
2. 什么是ddddocr?
ddddocr 是一个基于深度学习的开源OCR库,由国内开发者开发维护。它最大的特点是针对各种常见的验证码类型(如数字、字母组合)进行了专项优化。相较于通用OCR,它在识别带有干扰的验证码图片时表现更为出色,且使用起来非常简便。
3. 实现步骤
- 安装
pip install ddddocr
- 识别代码
import ddddocr
def recognize_with_ddddocr(image_path):
with open(image_path, 'rb') as f:
img_bytes = f.read()
ocr = ddddocr.DdddOcr()
res = ocr.classification(img_bytes)
return res
if __name__ == '__main__':
print(recognize_with_ddddocr('D:\\alirpa\\xxxx\\print-screen\\0.png'))
- 示例
![]()



- 识别结果

4. 优势与特点
- 简单易用: API设计简洁,学习成本低。
- 准确率高: 对于常见的、难度中等的验证码识别效果好。
- 轻量快速: 模型相对较小,识别速度快。
- 持续更新: 社区活跃,模型不断优化。
5. 问题处理
(1) 安装ddddocr,运行报错
Traceback (most recent call last):
File "D:\study_code\python\study\pythonProject\main\ocr.py", line 1, in <module>
import ddddocr
File "D:\Programs\Python\Python311\Lib\site-packages\ddddocr\__init__.py", line 10, in <module>
import onnxruntime
File "D:\Programs\Python\Python311\Lib\site-packages\onnxruntime\__init__.py", line 74, in <module>
raise import_capi_exception
File "D:\Programs\Python\Python311\Lib\site-packages\onnxruntime\__init__.py", line 24, in <module>
from onnxruntime.capi._pybind_state import (
File "D:\Programs\Python\Python311\Lib\site-packages\onnxruntime\capi\_pybind_state.py", line 32, in <module>
from .onnxruntime_pybind11_state import * # noqa
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ImportError: DLL load failed while importing onnxruntime_pybind11_state: 动态链接库(DLL)初始化例程失败。
原因:缺 VC 运行库
解决办法:
- 安装/修复 VC 运行库
官方下载地址(VS 2015-2022 合并包):
https://aka.ms/vs/17/release/vc_redist.x64.exe
- 下载后双击 → 修复/安装 → 重启命令行再试
python -c "import onnxruntime"
(2) 返回结果带有广告
欢迎使用ddddocr,本项目专注带动行业内卷,个人博客:wenanzhe.com
训练数据支持来源于:http://146.56.204.113:19199/preview
爬虫框架feapder可快速一键接入,快速开启爬虫之旅:https://github.com/Boris-code/feapder
谷歌reCaptcha验证码 / hCaptcha验证码 / funCaptcha验证码商业级识别接口:https://yescaptcha.com/i/NSwk7i
2722
原因:ddddocr.classification() 在 1.4.x 版本里把「欢迎语」直接写进了返回值,导致第一次调用总会把那段文本带出来。
解决办法:
把 OCR 实例做成全局单例,只初始化一次
import ddddocr
# 全局只实例化一次
OCR = ddddocr.DdddOcr(show_ad=False) # show_ad=False 1.4.6+ 支持,老版本可省略
def recognize_with_ddddocr(image_path):
with open(image_path, 'rb') as f:
return OCR.classification(f.read())
if __name__ == '__main__':
print(recognize_with_ddddocr(r'D:\alirpa\xxxx\print-screen\0.png'))
print(recognize_with_ddddocr(r'D:\alirpa\xxxx\print-screen\2.png'))
print(recognize_with_ddddocr(r'D:\alirpa\xxxx\print-screen\3.png'))
print(recognize_with_ddddocr(r'D:\alirpa\xxxx\print-screen\5.png'))
8623

被折叠的 条评论
为什么被折叠?



