目录
- 1 前言
- 2 文字验证码识别 - 使用 ddddocr
- 2.1 ddddocr 简介
- 2.2 安装 ddddocr
- 2.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 文字验证码识别 - 使用 ddddocr
2.1 ddddocr 简介
ddddocr 是一个基于深度学习的 OCR 识别库,专为验证码识别优化,具有以下特点:
- 轻量级,安装简单
- 识别准确率高
- 支持多种验证码类型
- 无需复杂配置
具体参考:ddddocr包链接
2.2 安装 ddddocr
pipinstallddddocr2.3 基本使用方法
importddddocr# 初始化OCR识别器ocr=ddddocr.DdddOcr(show_ad=False)# 读取验证码图片withopen('captcha.png','rb')asf:image=f.read()# 识别验证码result=ocr.classification(image)print(f"识别结果:{result}")2.4 验证码预处理 - 使用颜色选择
对于一些复杂的验证码,特别是彩色验证码,我们可以使用颜色选择的方法来提高识别率:
这里使用我的代码,使用color_filter_colors,官方文档里面的案例是错的。
importddddocrdefocr_color(color:str,image_path:str):""" 识别验证码图片中的指定颜色(红色或蓝色) :param color: 颜色名称,"red"或"blue" :return: 识别到的验证码字符串 """ocr=ddddocr.DdddOcr(show_ad=False)image=open(image_path,"rb").read()# 只保留指定颜色部分result=ocr.classification(image,color_filter_colors=[color])returnresult# 实际应用示例# 1. 首先获取验证码图片# 这里使用Playwright截图获取验证码img_loc=page.locator("#verifyImage")img_loc.screenshot(path="verify_code.png")# 2. 获取提示文字,判断需要识别的颜色tip_text=page.locator("#verifyTips").inner_text()if"蓝色"intip_text.strip():verifyCode=ocr_color("blue","verify_code.png")elif"红色"intip_text.strip():verifyCode=ocr_color("red","verify_code.png")else:# 其他类型验证码处理print("处理其他类型验证码")print(f"验证码识别结果:{verifyCode}")这种方法的优势在于:
- 可以只关注验证码中的特定颜色,忽略背景干扰
- 对于彩色验证码的识别率更高
- 代码简洁,不需要复杂的图像处理步骤
- 结合 ddddocr 的颜色过滤功能,效果显著
3 计算型验证码识别
3.1 计算型验证码特点
计算型验证码通常是一个简单的数学计算题,如“2+3=?”、“15-7=?”等。识别这类验证码需要:
- 提取验证码中的文本
- 解析数学表达式
- 计算结果
3.2 使用超级鹰 API 识别
对于计算型验证码,我们可以使用第三方验证码识别服务。这里以超级鹰(Chaojiying)API 为例,它支持多种验证码类型。
3.2.1 步骤 1:注册超级鹰账号
- 访问超级鹰官网
- 注册账号并充值
- 添加软件 ID,获取用户名、密码和软件 ID
3.2.2 步骤 2:实现超级鹰客户端,从官方下载即可
importrequestsfromhashlibimportmd5classChaojiying_Client(object):def__init__(self,username,password,soft_id):self.username=username password=password.encode('utf8')self.password=md5(password).hexdigest()self.soft_id=soft_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)}r=requests.post('http://upload.chaojiying.net/Upload/Processing.php',data=params,files=files,headers=self.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)r=requests.post('http://upload.chaojiying.net/Upload/Processing.php',data=params,headers=self.headers)returnr.json()defReportError(self,im_id):""" im_id: 报错题目的图片ID """params={'id':im_id,}params.update(self.base_params)r=requests.post('http://upload.chaojiying.net/Upload/ReportError.php',data=params,headers=self.headers)returnr.json()3.2.3 步骤 3:使用超级鹰识别计算型验证码
# 初始化超级鹰客户端chaojiying=Chaojiying_Client('用户名','密码','软件ID')# 读取验证码图片im=open('verify_code.png','rb').read()# 识别验证码(6001表示计算题类型)result=chaojiying.PostPic(im,6001)# 获取识别结果ifresult['err_no']==0:verify_code=result['pic_str']print(f"验证码识别结果:{verify_code}")else:print(f"识别失败:{result['err_str']}")3.3 纯本地计算型验证码识别
3.3.1 实现思路
- 用
ddddocr识别出验证码图片里的算式文本(例如:3+5=、9-2=、4×3=) - 清洗文本,去掉等号、空格
- 解析并计算结果
- 输出最终答案
3.3.2 完整代码
importddddocrimportredefcalc_captcha_recognize(image_path:str):""" 纯本地识别计算型验证码(支持 + - × ÷) :param image_path: 验证码图片路径 :return: 计算结果(数字) """# 1. 初始化OCRocr=ddddocr.DdddOcr(show_ad=False)# 2. 读取图片并识别withopen(image_path,"rb")asf:img_bytes=f.read()ocr_result=ocr.classification(img_bytes)print(f"识别到原始算式:{ocr_result}")# 3. 清洗文本:只保留 数字 + - * /# 把 × 替换成 *,把 ÷ 替换成 /expr=ocr_result.strip()expr=expr.replace("=","")# 去掉等号expr=expr.replace("×","*")expr=expr.replace("÷","/")expr=re.sub(r"[^0-9\+\-\*\/]","",expr)# 只保留数字和运算符print(f"清洗后算式:{expr}")# 4. 计算结果(安全计算,避免危险eval)try:# 简单计算验证码用eval足够安全calc_result=eval(expr)# 取整数(计算题一般都是整数)calc_result=int(calc_result)returncalc_resultexcept:return"识别/计算失败"# ====================== 使用示例 ======================if__name__=="__main__":# 传入你的计算型验证码图片answer=calc_captcha_recognize("calc_captcha.png")print(f"验证码最终答案:{answer}")4 验证码识别的实践建议
4.1 小建议
- 使用代理 IP:避免因频繁请求被网站屏蔽
- 添加请求间隔:模拟人类操作,避免请求过于频繁
- 异常处理:添加完善的异常处理机制,应对识别失败的情况
- 使用重复验证:验证不一定每次都成功,要重复验证,结合异常处理
4.2 常见问题及解决方案
| 问题 | 解决方案 |
|---|---|
| 识别率低 | 增加图像预处理步骤,尝试不同的 OCR 引擎 |
| 验证码频繁变化 | 动态调整识别策略,收集更多样本 |
| 被网站屏蔽 | 使用代理 IP,降低请求频率 |
| 计算型验证码解析错误 | 优化正则表达式,增加表达式解析的鲁棒性 |
5 总结
验证码识别是爬虫开发中的重要环节,通过使用ddddocr 进行文字识别和第三方服务处理计算型验证码,我们可以有效地应对网站的反爬机制。在实际应用中,需要根据具体情况选择合适的识别策略,并不断优化提高识别准确率。
希望本文对大家有所帮助,祝大家在爬虫开发的道路上越走越远!