
5分钟实战用Python的ddddocr库实现验证码自动化识别验证码识别一直是自动化测试和数据采集中的痛点。传统方法要么依赖第三方API有调用限制和费用问题要么需要手动标注大量样本训练模型时间成本高。而ddddocr这个基于深度学习的OCR库凭借其开箱即用的特性和高准确率正在成为开发者的新宠。1. 为什么选择ddddocr在自动化流程中遇到验证码时通常有几种解决方案人工识别效率低下无法规模化传统OCR库如Tesseract对验证码效果差商业API如百度OCR有调用次数限制自研模型需要标注数据和训练资源ddddocr的优势在于方案准确率速度成本适用场景ddddocr高快免费验证码、简单文本Tesseract低中等免费文档扫描商业API极高极快付费企业级应用自研模型可定制慢高特殊需求提示ddddocr特别适合中文和数字混合的验证码对扭曲、干扰线有很好的鲁棒性。2. 快速上手ddddocr2.1 环境准备首先安装库pip install ddddocr如果需要国内镜像pip install ddddocr -i https://pypi.tuna.tsinghua.edu.cn/simple/2.2 基础识别示例创建一个简单的识别脚本import ddddocr def recognize_captcha(image_path): ocr ddddocr.DdddOcr() with open(image_path, rb) as f: img_bytes f.read() return ocr.classification(img_bytes) # 使用示例 result recognize_captcha(captcha.png) print(f识别结果: {result})这个基础版本已经能处理大多数简单验证码。实际项目中你可能需要添加日志记录识别过程实现错误重试机制对结果进行后处理如去除空格3. 集成到自动化流程3.1 结合Selenium实现自动登录from selenium import webdriver import time import ddddocr def auto_login(url, username, password): driver webdriver.Chrome() driver.get(url) # 处理验证码 captcha_element driver.find_element(id, captcha-img) captcha_element.screenshot(temp_captcha.png) ocr ddddocr.DdddOcr() with open(temp_captcha.png, rb) as f: captcha_text ocr.classification(f.read()) # 填写表单 driver.find_element(id, username).send_keys(username) driver.find_element(id, password).send_keys(password) driver.find_element(id, captcha).send_keys(captcha_text) driver.find_element(id, submit-btn).click() time.sleep(2) # 等待登录完成 return driver3.2 异常处理与重试机制验证码识别不可能100%准确需要完善的错误处理def robust_recognize(image_path, retry3): ocr ddddocr.DdddOcr() for attempt in range(retry): try: with open(image_path, rb) as f: return ocr.classification(f.read()) except Exception as e: print(f识别失败重试 {attempt 1}/{retry}) time.sleep(1) raise Exception(验证码识别失败)4. 高级技巧与优化4.1 性能优化对于高频使用的场景# 全局维护一个OCR实例避免重复初始化 global_ocr ddddocr.DdddOcr() def fast_recognize(image_bytes): return global_ocr.classification(image_bytes)4.2 预处理提升准确率有时简单的预处理能显著提高识别率from PIL import Image import numpy as np def preprocess_image(image_path): img Image.open(image_path) # 转换为灰度图 img img.convert(L) # 二值化处理 img img.point(lambda x: 0 if x 128 else 255) return np.array(img) # 使用预处理后的图像 processed_img preprocess_image(captcha.png) result global_ocr.classification(processed_img.tobytes())4.3 处理特殊验证码类型对于滑块验证码def handle_slide_captcha(driver): # 获取背景图和滑块图 bg_element driver.find_element(xpath, //div[classbg-img]) slide_element driver.find_element(xpath, //div[classslide-img]) bg_element.screenshot(bg.png) slide_element.screenshot(slide.png) # 使用ddddocr计算滑块位置 det ddddocr.DdddOcr(detTrue) with open(bg.png, rb) as f: bg_bytes f.read() with open(slide.png, rb) as f: slide_bytes f.read() res det.slide_match(slide_bytes, bg_bytes) return res[target][0] # 返回滑块需要移动的距离5. 实际项目中的经验分享在电商数据采集项目中我们遇到了各种验证码数字字母混合ddddocr准确率约95%中文验证码准确率约85-90%计算题验证码需要额外逻辑处理和运算符一个实用的技巧是建立验证码样本库定期测试识别率import os from collections import defaultdict def test_accuracy(sample_dir): ocr ddddocr.DdddOcr() stats defaultdict(int) for filename in os.listdir(sample_dir): if not filename.endswith(.png): continue expected filename.split(.)[0] # 假设文件名就是正确结果 with open(os.path.join(sample_dir, filename), rb) as f: predicted ocr.classification(f.read()) stats[total] 1 if predicted expected: stats[correct] 1 else: print(f错误样本: {filename}, 识别为: {predicted}) accuracy stats[correct] / stats[total] * 100 print(f准确率: {accuracy:.2f}% ({stats[correct]}/{stats[total]}))对于特别复杂的验证码可以结合多种方法先用ddddocr尝试失败后尝试Tesseract不同引擎可能互补最后考虑人工复核在最近的金融数据采集项目中这套方案将验证码处理时间从平均15秒/个缩短到2秒/个准确率从60%提升到92%。