跳到主要内容 Python 爬虫实战:常见验证码自动识别方案 | 极客日志
Python AI 算法
Python 爬虫实战:常见验证码自动识别方案 本文详细阐述了 Python 爬虫中常见验证码的自动识别技术方案。内容涵盖文字验证码、图像验证码和滑动验证码三大类。针对文字验证码,介绍了基于 Tesseract OCR 的传统方法及基于 Keras/TensorFlow 的深度学习 CNN 模型构建;针对图像验证码,提出了迁移学习和目标检测的思路;针对滑动验证码,深入解析了 OpenCV 模板匹配算法及坐标计算逻辑。此外,文章还提供了环境搭建、代码示例、反爬对抗策略及法律合规建议,旨在帮助开发者构建稳定且合规的爬虫系统。
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 下需单独安装二进制文件:
sudo apt-get install tesseract-ocr
sudo apt-get install libtesseract-dev
3. 深度学习框架 若使用深度学习模型,建议安装 TensorFlow 或 PyTorch:
pip install tensorflow keras
三、文字验证码识别 文字验证码是最基础的类型,通常由随机生成的字母、数字或干扰线组成。识别方法主要分为传统 OCR 和深度学习两类。
1. 传统 OCR 识别 (Tesseract) Tesseract 对清晰、无干扰的文字效果较好,但在面对复杂背景时准确率会下降。因此,预处理至关重要。
预处理步骤
灰度化 :将彩色图片转为灰度图,减少通道数。
二值化 :通过阈值处理将图像分为黑白两色,去除噪点。
去噪 :使用高斯模糊或形态学操作去除孤立噪点。
代码示例 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)
_, binary = cv2.threshold(gray, 0 , 255 , cv2.THRESH_BINARY + cv2.THRESH_OTSU)
cv2.imwrite('preprocessed.png' , binary)
return 'preprocessed.png'
def recognize_text (image_path ):
processed_path = preprocess_image(image_path)
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)具有更高的鲁棒性。
模型构建思路
输入层 :固定尺寸的图片(如 64x64)。
卷积层 :提取特征(Conv2D + ReLU + MaxPooling)。
全连接层 :分类输出(Flatten + Dense)。
输出层 :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
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
四、图像验证码识别 图像验证码要求用户识别图片中的特定物体(如'选出所有红绿灯')。这类问题本质上是图像分类或多标签分类问题。
1. 识别策略 由于涉及物体检测,简单的 OCR 无法解决。通常采用以下两种方案:
迁移学习 :使用预训练的 ResNet、VGG 或 MobileNet 模型进行微调。
目标检测 :使用 YOLO 或 SSD 模型定位特定物体。
2. 实现流程
数据收集 :收集大量标注好的验证码图片。
数据增强 :旋转、裁剪、加噪,提高模型泛化能力。
模型训练 :冻结底层参数,仅训练顶层分类器。
推理预测 :输入验证码图片,输出类别概率。
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:.2 f} )' )
五、滑动验证码识别 滑动验证码是目前较为复杂的类型,通常需要计算滑块在背景图中的偏移量。核心算法是模板匹配。
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
4. 高级处理技巧
边缘检测 :如果背景纹理复杂,可先使用 Canny 算子提取边缘再进行匹配。
多尺度匹配 :如果滑块大小不确定,可在不同缩放比例下进行匹配。
动态调整 :结合 Selenium 或 Appium 模拟鼠标拖拽动作,而非直接修改请求参数。
六、综合应用与反爬对抗 在实际爬虫项目中,验证码识别往往只是其中一环。为了成功绕过验证,还需配合以下策略:
请求头伪造 :设置 User-Agent、Referer、Cookie 等字段,模拟真实浏览器。
IP 代理池 :频繁请求会导致 IP 被封禁,需轮换代理 IP。
时间间隔控制 :避免短时间内高频发送请求,加入随机延时。
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)
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)
七、法律合规与道德风险 虽然验证码识别技术在技术上可行,但必须严格遵守法律法规和网站的服务条款。
合法用途 :仅用于个人学习、研究或获得授权的数据采集。
禁止滥用 :不得用于批量注册账号、刷单、攻击服务器等非法活动。
尊重协议 :遵守 robots.txt 协议及网站的 API 使用限制。
责任自负 :因违规操作导致的封号、法律诉讼等后果由使用者自行承担。
八、总结 本文详细介绍了 Python 环境下三种常见验证码的识别原理与实现方案:
文字验证码 :推荐使用 Tesseract OCR 配合图像预处理,复杂场景下使用 CNN 深度学习模型。
图像验证码 :适合使用迁移学习模型进行物体分类识别。
滑动验证码 :利用 OpenCV 模板匹配算法计算偏移量,结合自动化控件模拟拖拽。
随着验证码技术的不断升级(如行为验证、语义验证),识别难度也在增加。开发者应持续关注新技术,同时始终坚守法律底线,确保技术应用的安全性与合规性。
相关免费在线工具 加密/解密文本 使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
RSA密钥对生成器 生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
Mermaid 预览与可视化编辑 基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
curl 转代码 解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online