【Python爬虫】验证码识别技术

目录

  • [1 前言](#1 前言)
  • [2 文字验证码识别 - 使用 ddddocr](#2 文字验证码识别 - 使用 ddddocr)
    • [2.1 ddddocr 简介](#2.1 ddddocr 简介)
    • [2.2 安装 ddddocr](#2.2 安装 ddddocr)
    • [2.3 基本使用方法](#2.3 基本使用方法)
    • [2.4 验证码预处理 - 使用颜色选择](#2.4 验证码预处理 - 使用颜色选择)
  • [3 计算型验证码识别](#3 计算型验证码识别)
    • [3.1 计算型验证码特点](#3.1 计算型验证码特点)
    • [3.2 使用超级鹰 API 识别](#3.2 使用超级鹰 API 识别)
      • [3.2.1 步骤 1:注册超级鹰账号](#3.2.1 步骤 1:注册超级鹰账号)
      • [3.2.2 步骤 2:实现超级鹰客户端,从官方下载即可](#3.2.2 步骤 2:实现超级鹰客户端,从官方下载即可)
      • [3.2.3 步骤 3:使用超级鹰识别计算型验证码](#3.2.3 步骤 3:使用超级鹰识别计算型验证码)
    • [3.3 纯本地计算型验证码识别](#3.3 纯本地计算型验证码识别)
      • [3.3.1 实现思路](#3.3.1 实现思路)
      • [3.3.2 完整代码](#3.3.2 完整代码)
  • [4 验证码识别的实践建议](#4 验证码识别的实践建议)
  • [4.1 小建议](#4.1 小建议)
    • [4.2 常见问题及解决方案](#4.2 常见问题及解决方案)
  • [5 总结](#5 总结)

1 前言

在网络爬虫开发过程中,验证码是一个常见的反爬机制。网站通过验证码来区分人类用户和机器爬虫,增加了自动化采集数据的难度。本文将详细介绍如何使用 Python 实现网站验证码的识别,包括文字验证码和计算型验证码的处理方法。

2 文字验证码识别 - 使用 ddddocr

2.1 ddddocr 简介

ddddocr 是一个基于深度学习的 OCR 识别库,专为验证码识别优化,具有以下特点:

  • 轻量级,安装简单
  • 识别准确率高
  • 支持多种验证码类型
  • 无需复杂配置

具体参考:ddddocr包链接

2.2 安装 ddddocr

bash 复制代码
pip install ddddocr

2.3 基本使用方法

python 复制代码
import ddddocr

# 初始化OCR识别器
ocr = ddddocr.DdddOcr(show_ad=False)

# 读取验证码图片
with open('captcha.png', 'rb') as f:
    image = f.read()

# 识别验证码
result = ocr.classification(image)
print(f"识别结果: {result}")

2.4 验证码预处理 - 使用颜色选择

对于一些复杂的验证码,特别是彩色验证码,我们可以使用颜色选择的方法来提高识别率:

这里使用我的代码,使用 color_filter_colors,官方文档里面的案例是错的。

python 复制代码
import ddddocr

def ocr_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])
    return result

# 实际应用示例
# 1. 首先获取验证码图片
# 这里使用Playwright截图获取验证码
img_loc = page.locator("#verifyImage")
img_loc.screenshot(path="verify_code.png")

# 2. 获取提示文字,判断需要识别的颜色
tip_text = page.locator("#verifyTips").inner_text()
 
if "蓝色" in tip_text.strip():
    verifyCode = ocr_color("blue", "verify_code.png")
elif "红色" in tip_text.strip():
    verifyCode = ocr_color("red", "verify_code.png")
else:
    # 其他类型验证码处理
    print("处理其他类型验证码")

print(f"验证码识别结果:{verifyCode}")

这种方法的优势在于:

  1. 可以只关注验证码中的特定颜色,忽略背景干扰
  2. 对于彩色验证码的识别率更高
  3. 代码简洁,不需要复杂的图像处理步骤
  4. 结合 ddddocr 的颜色过滤功能,效果显著

3 计算型验证码识别

3.1 计算型验证码特点

计算型验证码通常是一个简单的数学计算题,如"2+3=?"、"15-7=?"等。识别这类验证码需要:

  1. 提取验证码中的文本
  2. 解析数学表达式
  3. 计算结果

3.2 使用超级鹰 API 识别

对于计算型验证码,我们可以使用第三方验证码识别服务。这里以超级鹰(Chaojiying)API 为例,它支持多种验证码类型。

3.2.1 步骤 1:注册超级鹰账号

  1. 访问超级鹰官网
  2. 注册账号并充值
  3. 添加软件 ID,获取用户名、密码和软件 ID

3.2.2 步骤 2:实现超级鹰客户端,从官方下载即可

python 复制代码
import requests
from hashlib import md5

class Chaojiying_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)',
        }

    def PostPic(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)
        return r.json()

    def PostPic_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)
        return r.json()

    def ReportError(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)
        return r.json()

3.2.3 步骤 3:使用超级鹰识别计算型验证码

python 复制代码
# 初始化超级鹰客户端
chaojiying = Chaojiying_Client('用户名', '密码', '软件ID')

# 读取验证码图片
im = open('verify_code.png', 'rb').read()

# 识别验证码(6001表示计算题类型)
result = chaojiying.PostPic(im, 6001)

# 获取识别结果
if result['err_no'] == 0:
    verify_code = result['pic_str']
    print(f"验证码识别结果: {verify_code}")
else:
    print(f"识别失败: {result['err_str']}")

3.3 纯本地计算型验证码识别

3.3.1 实现思路

  1. ddddocr 识别出验证码图片里的算式文本 (例如:3+5=9-2=4×3=
  2. 清洗文本,去掉等号、空格
  3. 解析并计算结果
  4. 输出最终答案

3.3.2 完整代码

python 复制代码
import ddddocr
import re

def calc_captcha_recognize(image_path: str):
    """
    纯本地识别计算型验证码(支持 + - × ÷)
    :param image_path: 验证码图片路径
    :return: 计算结果(数字)
    """
    # 1. 初始化OCR
    ocr = ddddocr.DdddOcr(show_ad=False)
    
    # 2. 读取图片并识别
    with open(image_path, "rb") as f:
        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)
        return calc_result
    except:
        return "识别/计算失败"

# ====================== 使用示例 ======================
if __name__ == "__main__":
    # 传入你的计算型验证码图片
    answer = calc_captcha_recognize("calc_captcha.png")
    print(f"验证码最终答案:{answer}")

4 验证码识别的实践建议

4.1 小建议

  1. 使用代理 IP:避免因频繁请求被网站屏蔽
  2. 添加请求间隔:模拟人类操作,避免请求过于频繁
  3. 异常处理:添加完善的异常处理机制,应对识别失败的情况
  4. 使用重复验证:验证不一定每次都成功,要重复验证,结合异常处理

4.2 常见问题及解决方案

问题 解决方案
识别率低 增加图像预处理步骤,尝试不同的 OCR 引擎
验证码频繁变化 动态调整识别策略,收集更多样本
被网站屏蔽 使用代理 IP,降低请求频率
计算型验证码解析错误 优化正则表达式,增加表达式解析的鲁棒性

5 总结

验证码识别是爬虫开发中的重要环节,通过使用 ddddocr 进行文字识别和第三方服务处理计算型验证码,我们可以有效地应对网站的反爬机制。在实际应用中,需要根据具体情况选择合适的识别策略,并不断优化提高识别准确率。

希望本文对大家有所帮助,祝大家在爬虫开发的道路上越走越远!

相关推荐
xcbrand1 小时前
政府事业机构品牌全案公司有哪些
大数据·人工智能·python
XS0301061 小时前
Java基础笔记(一)
java·笔记·python
21439651 小时前
网页如何运行html
jvm·数据库·python
Irene19912 小时前
(AI总结版)Rich 配置经验总结:PyCharm 终端颜色显示操作指南
python·pycharm
小张同学8242 小时前
[特殊字符]Python 进阶实战指南(PyCharm 专属优化):从高效编码到工程化落地,告别新手低效写法
开发语言·python·pycharm
2402_854808372 小时前
Golang数组和切片有什么区别_Golang数组切片对比教程【通俗】
jvm·数据库·python
2401_865439632 小时前
如何在 Go 中精确安装指定版本的模块
jvm·数据库·python
xiaotao1312 小时前
01-编程基础与数学基石:Matplotlib & Seaborn
人工智能·python·matplotlib
zhangchaoxies2 小时前
c++ rpc框架选择 grpc和thrift哪个更适合c++
jvm·数据库·python