目录1 前言2 文字验证码识别 - 使用 ddddocr2.1 ddddocr 简介2.2 安装 ddddocr2.3 基本使用方法2.4 验证码预处理 - 使用颜色选择3 计算型验证码识别3.1 计算型验证码特点3.2 使用超级鹰 API 识别3.2.1 步骤 1注册超级鹰账号3.2.2 步骤 2实现超级鹰客户端从官方下载即可3.2.3 步骤 3使用超级鹰识别计算型验证码3.3 纯本地计算型验证码识别3.3.1 实现思路3.3.2 完整代码4 验证码识别的实践建议4.1 小建议4.2 常见问题及解决方案5 总结1 前言在网络爬虫开发过程中验证码是一个常见的反爬机制。网站通过验证码来区分人类用户和机器爬虫增加了自动化采集数据的难度。本文将详细介绍如何使用 Python 实现网站验证码的识别包括文字验证码和计算型验证码的处理方法。2 文字验证码识别 - 使用 ddddocr2.1 ddddocr 简介ddddocr 是一个基于深度学习的 OCR 识别库专为验证码识别优化具有以下特点轻量级安装简单识别准确率高支持多种验证码类型无需复杂配置具体参考ddddocr包链接2.2 安装 ddddocrpipinstallddddocr2.3 基本使用方法importddddocr# 初始化OCR识别器ocrddddocr.DdddOcr(show_adFalse)# 读取验证码图片withopen(captcha.png,rb)asf:imagef.read()# 识别验证码resultocr.classification(image)print(f识别结果:{result})2.4 验证码预处理 - 使用颜色选择对于一些复杂的验证码特别是彩色验证码我们可以使用颜色选择的方法来提高识别率这里使用我的代码使用color_filter_colors官方文档里面的案例是错的。importddddocrdefocr_color(color:str,image_path:str): 识别验证码图片中的指定颜色红色或蓝色 :param color: 颜色名称red或blue :return: 识别到的验证码字符串 ocrddddocr.DdddOcr(show_adFalse)imageopen(image_path,rb).read()# 只保留指定颜色部分resultocr.classification(image,color_filter_colors[color])returnresult# 实际应用示例# 1. 首先获取验证码图片# 这里使用Playwright截图获取验证码img_locpage.locator(#verifyImage)img_loc.screenshot(pathverify_code.png)# 2. 获取提示文字判断需要识别的颜色tip_textpage.locator(#verifyTips).inner_text()if蓝色intip_text.strip():verifyCodeocr_color(blue,verify_code.png)elif红色intip_text.strip():verifyCodeocr_color(red,verify_code.png)else:# 其他类型验证码处理print(处理其他类型验证码)print(f验证码识别结果{verifyCode})这种方法的优势在于可以只关注验证码中的特定颜色忽略背景干扰对于彩色验证码的识别率更高代码简洁不需要复杂的图像处理步骤结合 ddddocr 的颜色过滤功能效果显著3 计算型验证码识别3.1 计算型验证码特点计算型验证码通常是一个简单的数学计算题如“23?”、“15-7?”等。识别这类验证码需要提取验证码中的文本解析数学表达式计算结果3.2 使用超级鹰 API 识别对于计算型验证码我们可以使用第三方验证码识别服务。这里以超级鹰ChaojiyingAPI 为例它支持多种验证码类型。3.2.1 步骤 1注册超级鹰账号访问超级鹰官网注册账号并充值添加软件 ID获取用户名、密码和软件 ID3.2.2 步骤 2实现超级鹰客户端从官方下载即可importrequestsfromhashlibimportmd5classChaojiying_Client(object):def__init__(self,username,password,soft_id):self.usernameusername passwordpassword.encode(utf8)self.passwordmd5(password).hexdigest()self.soft_idsoft_id self.base_params{user:self.username,pass2:self.password,softid:self.soft_id,}self.headers{Connection:Keep-Alive,User-Agent:Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0),}defPostPic(self,im,codetype): im: 图片字节 codetype: 题目类型 参考 http://www.chaojiying.com/price.html params{codetype:codetype,}params.update(self.base_params)files{userfile:(ccc.jpg,im)}rrequests.post(http://upload.chaojiying.net/Upload/Processing.php,dataparams,filesfiles,headersself.headers)returnr.json()defPostPic_base64(self,base64_str,codetype): im: 图片字节 codetype: 题目类型 参考 http://www.chaojiying.com/price.html params{codetype:codetype,file_base64:base64_str}params.update(self.base_params)rrequests.post(http://upload.chaojiying.net/Upload/Processing.php,dataparams,headersself.headers)returnr.json()defReportError(self,im_id): im_id: 报错题目的图片ID params{id:im_id,}params.update(self.base_params)rrequests.post(http://upload.chaojiying.net/Upload/ReportError.php,dataparams,headersself.headers)returnr.json()3.2.3 步骤 3使用超级鹰识别计算型验证码# 初始化超级鹰客户端chaojiyingChaojiying_Client(用户名,密码,软件ID)# 读取验证码图片imopen(verify_code.png,rb).read()# 识别验证码6001表示计算题类型resultchaojiying.PostPic(im,6001)# 获取识别结果ifresult[err_no]0:verify_coderesult[pic_str]print(f验证码识别结果:{verify_code})else:print(f识别失败:{result[err_str]})3.3 纯本地计算型验证码识别3.3.1 实现思路用ddddocr识别出验证码图片里的算式文本例如35、9-2、4×3清洗文本去掉等号、空格解析并计算结果输出最终答案3.3.2 完整代码importddddocrimportredefcalc_captcha_recognize(image_path:str): 纯本地识别计算型验证码支持 - × ÷ :param image_path: 验证码图片路径 :return: 计算结果数字 # 1. 初始化OCRocrddddocr.DdddOcr(show_adFalse)# 2. 读取图片并识别withopen(image_path,rb)asf:img_bytesf.read()ocr_resultocr.classification(img_bytes)print(f识别到原始算式{ocr_result})# 3. 清洗文本只保留 数字 - * /# 把 × 替换成 *把 ÷ 替换成 /exprocr_result.strip()exprexpr.replace(,)# 去掉等号exprexpr.replace(×,*)exprexpr.replace(÷,/)exprre.sub(r[^0-9\\-\*\/],,expr)# 只保留数字和运算符print(f清洗后算式{expr})# 4. 计算结果安全计算避免危险evaltry:# 简单计算验证码用eval足够安全calc_resulteval(expr)# 取整数计算题一般都是整数calc_resultint(calc_result)returncalc_resultexcept:return识别/计算失败# 使用示例 if__name____main__:# 传入你的计算型验证码图片answercalc_captcha_recognize(calc_captcha.png)print(f验证码最终答案{answer})4 验证码识别的实践建议4.1 小建议使用代理 IP避免因频繁请求被网站屏蔽添加请求间隔模拟人类操作避免请求过于频繁异常处理添加完善的异常处理机制应对识别失败的情况使用重复验证验证不一定每次都成功要重复验证结合异常处理4.2 常见问题及解决方案问题解决方案识别率低增加图像预处理步骤尝试不同的 OCR 引擎验证码频繁变化动态调整识别策略收集更多样本被网站屏蔽使用代理 IP降低请求频率计算型验证码解析错误优化正则表达式增加表达式解析的鲁棒性5 总结验证码识别是爬虫开发中的重要环节通过使用ddddocr 进行文字识别和第三方服务处理计算型验证码我们可以有效地应对网站的反爬机制。在实际应用中需要根据具体情况选择合适的识别策略并不断优化提高识别准确率。希望本文对大家有所帮助祝大家在爬虫开发的道路上越走越远