ddddocr实战:从点选验证码识别到自动化脚本构建

📅 2026/7/6 4:19:54
ddddocr实战:从点选验证码识别到自动化脚本构建
1. ddddocr简介与安装ddddocr是一个基于深度学习的开源验证码识别库由国内开发者sml2h3和kerlomz共同开发。这个库最大的特点就是简单易用不需要复杂的配置几行代码就能实现验证码识别。我最早是在处理一个电商爬虫项目时接触到它的当时被它的识别准确率和易用性惊艳到了。安装ddddocr非常简单只需要一条pip命令pip install ddddocr如果你遇到下载速度慢的问题可以试试国内镜像源pip install ddddocr -i https://pypi.douban.com/simple安装完成后可以通过以下代码测试是否安装成功import ddddocr ocr ddddocr.DdddOcr(show_adFalse) print(ddddocr版本:, ocr.version)这里有个小技巧show_adFalse参数可以关闭库的广告提示。虽然开发者放广告可以理解但在正式项目中还是关掉比较清爽。2. 点选验证码识别原理点选验证码是目前比较常见的一种验证码形式通常要求用户点击图片中指定的文字或物体。这类验证码的难点在于需要准确定位目标文字的位置需要识别目标文字的内容需要模拟人类点击行为ddddocr通过detTrue参数开启目标检测模式可以同时解决前两个问题。它的工作原理是这样的目标检测阶段使用CNN网络检测图片中所有可能的文字区域返回每个区域的坐标框文字识别阶段对每个检测到的区域进行OCR识别得到文字内容结果整合将文字内容和对应坐标绑定形成完整的识别结果我实测下来对于常见的汉字点选验证码ddddocr的识别准确率能达到90%以上。特别是对扭曲、干扰线较多的验证码表现比传统方法好很多。3. 实战汉字点选验证码识别让我们通过一个具体案例来看看如何使用ddddocr识别点选验证码。假设我们有如下验证码图片# 实际使用时请替换为真实图片路径3.1 基础识别代码首先是最基础的识别代码import ddddocr # 初始化检测器 det ddddocr.DdddOcr(detTrue, show_adFalse) # 读取图片 with open(captcha.jpg, rb) as f: image_bytes f.read() # 执行检测 results det.detection(image_bytes) print(识别结果:, results)这段代码会输出类似这样的结果[ [京, [10, 20, 50, 60]], [东, [70, 20, 110, 60]], [购, [130, 20, 170, 60]], [物, [190, 20, 230, 60]] ]每个结果项包含两部分识别出的文字和对应的坐标框左上x,左上y,右下x,右下y。3.2 结果可视化为了方便调试我们可以把识别结果可视化from PIL import Image, ImageDraw # 打开图片 img Image.open(captcha.jpg) draw ImageDraw.Draw(img) # 绘制识别结果 for text, (x1, y1, x2, y2) in results: # 画矩形框 draw.rectangle([x1, y1, x2, y2], outlinered, width2) # 添加文字标签 draw.text((x1, y1-20), text, fillred) # 保存结果 img.save(result.jpg)这样就能生成一张带识别结果的图片方便检查识别是否准确。4. 构建自动化点击脚本识别只是第一步我们的最终目标是实现自动化操作。下面介绍如何将识别结果转化为实际的点击操作。4.1 坐标转换验证码识别返回的是文字区域的坐标但实际点击需要的是中心点坐标。我们可以这样计算def get_click_points(results): click_points {} for text, (x1, y1, x2, y2) in results: center_x (x1 x2) // 2 center_y (y1 y2) // 2 click_points[text] (center_x, center_y) return click_points4.2 模拟点击有了点击坐标后我们可以使用pyautogui库模拟鼠标点击import pyautogui import time def auto_click(target_text, click_points): if target_text not in click_points: print(f未找到目标文字: {target_text}) return False x, y click_points[target_text] pyautogui.moveTo(x, y, duration0.5) time.sleep(0.2) pyautogui.click() return True使用时先获取验证码要求点击的文字可以通过OCR识别或者页面解析获取然后调用# 假设验证码要求点击京东 auto_click(京东, click_points)4.3 完整流程封装将以上步骤封装成一个完整的自动化处理类class CaptchaSolver: def __init__(self): self.det ddddocr.DdddOcr(detTrue, show_adFalse) def solve_captcha(self, image_path, target_text): # 读取图片 with open(image_path, rb) as f: image_bytes f.read() # 识别验证码 results self.det.detection(image_bytes) # 计算点击位置 click_points {} for text, (x1, y1, x2, y2) in results: center_x (x1 x2) // 2 center_y (y1 y2) // 2 click_points[text] (center_x, center_y) # 执行点击 if target_text not in click_points: raise ValueError(f目标文字{target_text}未找到) x, y click_points[target_text] pyautogui.moveTo(x, y, duration0.5) time.sleep(0.2) pyautogui.click() return True5. 高级技巧与优化在实际使用中可能会遇到各种特殊情况。下面分享几个我在项目中总结的优化技巧。5.1 处理动态验证码有些网站的验证码会动态变化位置这时需要先截图再识别import pyautogui # 截取验证码区域 captcha_region (100, 100, 300, 200) # 根据实际情况调整 screenshot pyautogui.screenshot(regioncaptcha_region) screenshot.save(temp_captcha.jpg) # 识别截图 solver CaptchaSolver() solver.solve_captcha(temp_captcha.jpg, 京东)5.2 多目标点击有些验证码要求按顺序点击多个文字可以这样处理def solve_multi_targets(image_path, target_texts): # 识别验证码同上 ... # 按顺序点击 for text in target_texts: if text not in click_points: raise ValueError(f目标文字{text}未找到) x, y click_points[text] pyautogui.moveTo(x, y, duration0.3) time.sleep(0.1) pyautogui.click() time.sleep(0.5) # 点击间隔5.3 识别率优化如果遇到识别率不高的情况可以尝试以下方法图片预处理二值化、去噪等from PIL import ImageFilter def preprocess_image(image_path): img Image.open(image_path) # 转为灰度图 img img.convert(L) # 二值化 img img.point(lambda x: 255 if x 180 else 0) # 去噪 img img.filter(ImageFilter.MedianFilter(3)) img.save(processed.jpg) return processed.jpg调整识别参数det ddddocr.DdddOcr( detTrue, show_adFalse, threshold0.6 # 调整置信度阈值 )使用自定义模型det ddddocr.DdddOcr( detTrue, import_onnx_pathcustom_model.onnx, charsets_pathcustom_charsets.json )6. 实际项目中的注意事项在真实项目中应用时有几个坑需要特别注意反爬机制频繁调用验证码识别可能触发网站反爬建议添加随机延迟多线程安全ddddocr实例不是线程安全的每个线程应该创建自己的实例错误处理网络请求、图片处理等环节都可能出错需要完善的异常处理性能优化批量处理时复用ocr实例避免重复创建这里分享一个我在项目中使用的线程安全封装from threading import Lock class ThreadSafeOCR: def __init__(self): self.lock Lock() self.ocr None def get_ocr(self): with self.lock: if self.ocr is None: self.ocr ddddocr.DdddOcr(detTrue, show_adFalse) return self.ocr使用时每个线程调用get_ocr()获取自己的实例即可。7. 与其他工具的对比在验证码识别领域除了ddddocr还有其他一些选择这里简单对比下工具优点缺点适用场景ddddocr中文识别好使用简单免费对英文支持一般中文验证码Tesseract支持多种语言历史悠久中文识别率低配置复杂英文文档商业OCR API识别率高服务稳定收费有调用限制企业级应用自训练模型可定制化需要数据和技术积累特殊验证码从我实际使用经验来看对于中文点选验证码ddddocr是平衡性最好的选择。特别是它的det模式把目标检测和文字识别结合在一起大大简化了开发流程。