跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

Python 爬虫实战:常见验证码自动识别方案

详细阐述了 Python 爬虫中常见验证码的自动识别技术方案。内容涵盖文字验证码、图像验证码和滑动验证码三大类。针对文字验证码,介绍了基于 Tesseract OCR 的传统方法及基于 Keras/TensorFlow 的深度学习 CNN 模型构建;针对图像验证码,提出了迁移学习和目标检测的思路;针对滑动验证码,深入解析了 OpenCV 模板匹配算法及坐标计算逻辑。此外,文章还提供了环境搭建、代码示例、反爬对抗策略及法律合规建议,旨在帮助开发者构建稳定且合规的爬虫系统。

Ne0发布于 2025/2/7更新于 2026/9/1265 浏览
Python 爬虫实战:常见验证码自动识别方案

Python 爬虫实战:常见验证码自动识别方案

一、引言

在网页数据采集过程中,验证码(CAPTCHA)是阻碍自动化脚本访问的主要屏障之一。验证码的全称是 Completely Automated Public Turing test to tell Computers and Humans Apart,即完全自动化的公共图灵测试,用于区分人类用户和计算机程序。其核心目的是防止恶意攻击、垃圾注册、暴力破解等自动化行为。

对于爬虫开发者而言,理解验证码的生成机制并掌握相应的识别技术,是提升爬虫稳定性和效率的关键。本文将深入探讨三种主流验证码类型:文字验证码、图像验证码和滑动验证码,并提供基于 Python 的完整识别解决方案。

二、环境准备与依赖安装

在进行验证码识别之前,需要搭建好必要的开发环境。主要依赖包括图像处理库、OCR 引擎以及深度学习框架。

1. 基础依赖

pip install requests pillow opencv-python numpy

2. OCR 引擎 (Tesseract)

Tesseract 是 Google 开源的 OCR 引擎,支持多种语言识别。Linux 下需单独安装二进制文件:

# Ubuntu/Debian
sudo apt-get install tesseract-ocr
sudo apt-get install libtesseract-dev
# Windows/Mac 需从官网下载安装包并配置环境变量

3. 深度学习框架

若使用深度学习模型,建议安装 TensorFlow 或 PyTorch:

pip install tensorflow keras

三、文字验证码识别

文字验证码是最基础的类型,通常由随机生成的字母、数字或干扰线组成。识别方法主要分为传统 OCR 和深度学习两类。

1. 传统 OCR 识别 (Tesseract)

Tesseract 对清晰、无干扰的文字效果较好,但在面对复杂背景时准确率会下降。因此,预处理至关重要。

预处理步骤
  1. 灰度化:将彩色图片转为灰度图,减少通道数。
  2. 二值化:通过阈值处理将图像分为黑白两色,去除噪点。
  3. 去噪:使用高斯模糊或形态学操作去除孤立噪点。
代码示例
from PIL import Image, ImageFilter
import pytesseract
import cv2
import numpy as np

def preprocess_image(image_path):
    # 读取图片
    img = cv2.imread(image_path)
    
    # 转灰度
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    # 二值化 (Otsu's thresholding)
    _, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
    
    # 保存预处理后的图片供 Tesseract 读取
    cv2.imwrite('preprocessed.png', binary)
    return 'preprocessed.png'

def recognize_text(image_path):
    # 预处理
    processed_path = preprocess_image(image_path)
    
    # 调用 Tesseract
    config = '--psm 6 --oem 3 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
    text = pytesseract.image_to_string(Image.open(processed_path), config=config)
    
    return text.strip()

if __name__ == '__main__':
    result = recognize_text('captcha.png')
    print(f'识别结果:{result}')

2. 深度学习识别

对于包含扭曲、粘连或复杂背景的验证码,深度学习模型(如 CNN)具有更高的鲁棒性。

模型构建思路
  1. 输入层:固定尺寸的图片(如 64x64)。
  2. 卷积层:提取特征(Conv2D + ReLU + MaxPooling)。
  3. 全连接层:分类输出(Flatten + Dense)。
  4. 输出层:Softmax 激活函数,对应字符集概率。
代码示例 (Keras)
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
from tensorflow.keras.utils import to_categorical
import numpy as np

# 假设已有训练好的数据 X_train, y_train
# X_train shape: (num_samples, height, width, channels)
# y_train shape: (num_samples, num_classes)

def build_model(input_shape, num_classes):
    model = Sequential()
    model.add(Conv2D(32, (3, 3), activation='relu', input_shape=input_shape))
    model.add(MaxPooling2D((2, 2)))
    model.add(Conv2D(64, (3, 3), activation='relu'))
    model.add(MaxPooling2D((2, 2)))
    model.add(Flatten())
    model.add(Dense(128, activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(num_classes, activation='softmax'))
    
    model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
    return model

# 加载预训练模型
# model = load_model('captcha_model.h5')
# prediction = model.predict(test_image)

四、图像验证码识别

图像验证码要求用户识别图片中的特定物体(如'选出所有红绿灯')。这类问题本质上是图像分类或多标签分类问题。

1. 识别策略

由于涉及物体检测,简单的 OCR 无法解决。通常采用以下两种方案:

  1. 迁移学习:使用预训练的 ResNet、VGG 或 MobileNet 模型进行微调。
  2. 目标检测:使用 YOLO 或 SSD 模型定位特定物体。

2. 实现流程

  1. 数据收集:收集大量标注好的验证码图片。
  2. 数据增强:旋转、裁剪、加噪,提高模型泛化能力。
  3. 模型训练:冻结底层参数,仅训练顶层分类器。
  4. 推理预测:输入验证码图片,输出类别概率。

3. 代码逻辑示意

from tensorflow.keras.applications import MobileNetV2
from tensorflow.keras.preprocessing import image
from tensorflow.keras.applications.mobilenet_v2 import preprocess_input, decode_predictions

def predict_object(image_path):
    # 加载预训练模型
    base_model = MobileNetV2(weights='imagenet', include_top=True)
    
    # 读取并预处理图片
    img = image.load_img(image_path, target_size=(224, 224))
    x = image.img_to_array(img)
    x = np.expand_dims(x, axis=0)
    x = preprocess_input(x)
    
    # 预测
    preds = base_model.predict(x)
    results = decode_predictions(preds, top=3)[0]
    
    for label, description, score in results:
        if score > 0.5:
            print(f'识别为:{description} (置信度:{score:.2f})')

五、滑动验证码识别

滑动验证码是目前较为复杂的类型,通常需要计算滑块在背景图中的偏移量。核心算法是模板匹配。

1. 原理分析

系统通常会提供一张完整的背景图和一张带有缺口的背景图,或者提供缺口图和背景图。我们需要找到缺口图在背景图中的位置。

2. 模板匹配算法

OpenCV 提供了 cv2.matchTemplate 函数,通过计算滑动窗口与模板的相关系数来寻找最佳匹配位置。

3. 代码实现

import cv2
import numpy as np

def find_slider_position(bg_path, gap_path):
    # 读取图片
    bg = cv2.imread(bg_path)
    gap = cv2.imread(gap_path)
    
    # 转换为灰度图
    gray_bg = cv2.cvtColor(bg, cv2.COLOR_BGR2GRAY)
    gray_gap = cv2.cvtColor(gap, cv2.COLOR_BGR2GRAY)
    
    # 获取缺口图的宽和高
    w, h = gray_gap.shape[1], gray_gap.shape[0]
    
    # 执行模板匹配
    res = cv2.matchTemplate(gray_bg, gray_gap, cv2.TM_CCOEFF_NORMED)
    
    # 查找最大值及其位置
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
    
    # 计算中心点坐标
    # 注意:实际移动距离通常是左上角坐标加上缺口宽度的一半
    left = max_loc[0]
    top = max_loc[1]
    distance = left + w // 2
    
    print(f'滑块起始位置:({left}, {top})')
    print(f'需要移动的距离:{distance}px')
    
    return distance

# 使用示例
# distance = find_slider_position('bg.png', 'gap.png')

4. 高级处理技巧

  • 边缘检测:如果背景纹理复杂,可先使用 Canny 算子提取边缘再进行匹配。
  • 多尺度匹配:如果滑块大小不确定,可在不同缩放比例下进行匹配。
  • 动态调整:结合 Selenium 或 Appium 模拟鼠标拖拽动作,而非直接修改请求参数。

六、综合应用与反爬对抗

在实际爬虫项目中,验证码识别往往只是其中一环。为了成功绕过验证,还需配合以下策略:

  1. 请求头伪造:设置 User-Agent、Referer、Cookie 等字段,模拟真实浏览器。
  2. IP 代理池:频繁请求会导致 IP 被封禁,需轮换代理 IP。
  3. 时间间隔控制:避免短时间内高频发送请求,加入随机延时。
  4. Cookie 维护:保持会话状态,利用 Session 对象管理 Cookie。

示例:集成到 Requests 中

import requests
from fake_useragent import UserAgent

headers = {
    'User-Agent': UserAgent().chrome,
    'Accept-Language': 'zh-CN,zh;q=0.9'
}

session = requests.Session()
response = session.get('https://example.com/captcha', headers=headers)

# 假设已识别出验证码 token
captcha_token = get_captcha_from_image(response.content)

payload = {
    'username': 'user',
    'password': 'pass',
    'captcha': captcha_token
}

login_response = session.post('https://example.com/login', data=payload, headers=headers)
print(login_response.text)

七、法律合规与道德风险

虽然验证码识别技术在技术上可行,但必须严格遵守法律法规和网站的服务条款。

  1. 合法用途:仅用于个人学习、研究或获得授权的数据采集。
  2. 禁止滥用:不得用于批量注册账号、刷单、攻击服务器等非法活动。
  3. 尊重协议:遵守 robots.txt 协议及网站的 API 使用限制。
  4. 责任自负:因违规操作导致的封号、法律诉讼等后果由使用者自行承担。

八、总结

本文详细介绍了 Python 环境下三种常见验证码的识别原理与实现方案:

  • 文字验证码:推荐使用 Tesseract OCR 配合图像预处理,复杂场景下使用 CNN 深度学习模型。
  • 图像验证码:适合使用迁移学习模型进行物体分类识别。
  • 滑动验证码:利用 OpenCV 模板匹配算法计算偏移量,结合自动化控件模拟拖拽。

随着验证码技术的不断升级(如行为验证、语义验证),识别难度也在增加。开发者应持续关注新技术,同时始终坚守法律底线,确保技术应用的安全性与合规性。

目录

  1. Python 爬虫实战:常见验证码自动识别方案
  2. 一、引言
  3. 二、环境准备与依赖安装
  4. 1. 基础依赖
  5. 2. OCR 引擎 (Tesseract)
  6. Ubuntu/Debian
  7. Windows/Mac 需从官网下载安装包并配置环境变量
  8. 3. 深度学习框架
  9. 三、文字验证码识别
  10. 1. 传统 OCR 识别 (Tesseract)
  11. 预处理步骤
  12. 代码示例
  13. 2. 深度学习识别
  14. 模型构建思路
  15. 代码示例 (Keras)
  16. 假设已有训练好的数据 Xtrain, ytrain
  17. Xtrain shape: (numsamples, height, width, channels)
  18. ytrain shape: (numsamples, num_classes)
  19. 加载预训练模型
  20. model = loadmodel('captchamodel.h5')
  21. prediction = model.predict(test_image)
  22. 四、图像验证码识别
  23. 1. 识别策略
  24. 2. 实现流程
  25. 3. 代码逻辑示意
  26. 五、滑动验证码识别
  27. 1. 原理分析
  28. 2. 模板匹配算法
  29. 3. 代码实现
  30. 使用示例
  31. distance = findsliderposition('bg.png', 'gap.png')
  32. 4. 高级处理技巧
  33. 六、综合应用与反爬对抗
  34. 示例:集成到 Requests 中
  35. 假设已识别出验证码 token
  36. 七、法律合规与道德风险
  37. 八、总结

更多推荐文章

查看全部
  • AI 进展与争议:从开源模型到政策分歧
  • 前端设计与布局常用术语中英速查指南
  • Python 自动批量创建日期文件夹
  • Git-AI:实现 AI 生成代码归属追踪的 Git 扩展工具
  • OpenClaw 入门指南:AI Agent 本地部署与优化
  • DeepSeek + 通义万相高效制作 AI 视频实战详解
  • PyTorch 文本引导图像生成与 Stable Diffusion 实践
  • AIGC 内容去 AI 味:Prompt 设计原理与实战指南
  • 谷歌 I/O 大会发布 Gemini 1.5 Pro 及视频模型 Veo,上下文窗口达 200 万
  • Qwen3.5 系列开源大模型本地部署全流程(ModelScope)
  • 医疗 AI 场景下的模型融合与集成策略
  • OpenClaw 实战:用 Telegram 打造个人 AI 助手
  • LLM Agent 反思工作流进阶:Self-Refine、CRITIC 与 Reflexion 技术解析
  • Go 语言演进:泛型与 WebAssembly 实战指南
  • 基于 SpringBoot、Vue、Netty 与 WebRTC 的视频聊天实现
  • AI 绘画精讲与 AIGC 时代游戏美术设计
  • 新能源集控系统数据库架构实践:时序数据与高可用设计
  • n8n 集成飞书机器人实战指南:环境配置与常见问题解决
  • Kimi K2.5 开源部署、API 接入、Agent 集群与多模态实战
  • MCP AI Copilot 集成开发实战与高效代码生成技巧

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online