自动化和爬虫场景下,验证码是绕不开的关键环节,ddddocr作为一款轻量级、高精度的开源OCR工具,凭借其无需复杂配置、识别速度快、对验证码友好等特性,成为Python开发者的首选。本文将介绍ddddocr库的用法。
一、ddddocr简介
ddddocr是由国内开发者开发的OCR识别库,专注于解决各类简单验证码(数字、字母、汉字混合等)的识别问题。与Tesseract等重量级OCR工具相比,它的优势在于:
- 零配置:无需训练模型,安装即可使用
- 轻量级:体积小,依赖少(核心依赖仅opencv-python)
- 速度快:单张图片识别耗时通常在0.1秒内
- 验证码友好:对扭曲、干扰线、简单背景的验证码识别率高
二、ddddocr安装
$ pip install ddddocr -i https://pypi.tuna.tsinghua.edu.cn/simple
三、应用场景
1、ddddocr识别图片验证码(英文字母+数字)
import ddddocr
import requests
import base64
import io
# 模拟请求头
headers = {
"User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36"
}
# 图片验证码获取地址
code_image_url = "https://xxxxx/imgcode"
def getImageUrl():
try:
# 请求获取验证码图片
response = requests.get(url = code_image_url, headers = headers, timeout = 5, verify=False)
if response.status_code == 200:
data = response.json()
image_url = data.get("data")
print(f"获取验证码图片二进制数据集成功...")
_, encoded_image = image_url.split(',', 1)
# 将图片二进制数据进行解码
decoded_image = base64.b64decode(encoded_image)
# 识别验证码内容
ocr = ddddocr.DdddOcr()
res = ocr.classification(decoded_image)
print(f"验证码识别成功:{res}")
return res
except requests.exceptions.RequestException as e:
print("请求发生异常:", e)
# 执行函数
getImageUrl()
ddddocr常见问题
1、module ‘PIL.Image‘ has no attribute ‘ANTIALIAS
问题说明
pillow的10.0.0版本中,ANTIALIAS被删除了,改为10.0版本许可的参数即可。
解决方法
方案一(推荐):修改ddddocr的_init_.py文件,进行替换
## 原代码
image = image.resize((int(image.size[0] * (64 / image.size[1])), 64), Image.ANTIALIAS).convert('L')
## 替换
image = image.resize((int(image.size[0] * (64 / image.size[1])), 64), Image.LANCZOS).convert('L')
方案二:降级Pillow的版本至9.5.0
$ pip uninstall -y Pillow
$ pip install Pillow==9.5.0
2、No connection adapters were found for ‘data:image/png;base64,…’
问题说明
该错误常发生于使用像requests库访问Data URI scheme时。Data URI scheme(如data:image/png;base64,...)并不是一个有效的URL,只是一个嵌入在文档或网页中的二进制数据。
由于Data URI scheme不是一个指向网络上某个位置的URL,所以不能使用requests库去下载或请求它。。
解决方法
从Data URI中提取出Base64编码的数据,然后将其解码为二进制数据,并最终写入文件。以下是代码示例:
import base64
import io
from PIL import Image
# Data URI字符串
data_uri = 'data:image/png;base64,xxxxxxxxxxx'
# 分割Data URI以获取Base64编码的部分
_, encoded_image = data_uri.split(',', 1)
# 解码Base64字符串为二进制数据
decoded_image = base64.b64decode(encoded_image)
# 使用PIL库将二进制数据转换为图像对象
image = Image.open(io.BytesIO(decoded_image))
# 将图像保存到本地文件
image.save('output.png')
1234

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



