目录
🎬 攻城狮7号:个人主页
🔥 个人专栏: 《python爬虫教程》
⛺️ 君子慎独!
🌈 大家好,欢迎来访我的博客!
⛳️ 此篇文章主要介绍 图形验证码 的识别
📚 本期文章收录在《python爬虫教程》,大家有兴趣可以自行查看!
⛺️ 欢迎各位 ✔️ 点赞 👍 收藏 ⭐留言 📝!
前言
在互联网安全防护中,验证码是一道常见的"门槛",它们被广泛用于防止恶意爬虫和自动化攻击。随着技术进步,验证码的形式也日益多样化,从最初的简单数字字母组合,到如今的滑动拼图、点选图片、复杂干扰线等多种类型。对于数据采集和自动化测试来说,如何高效识别验证码成为了一个重要课题。
本节将聚焦于最基础、最常见的"图形验证码",即由数字或字母组成的图片验证码。我们将介绍其识别原理、常用工具、图像预处理技巧,并通过代码实例带你一步步实现自动识别。
一、学习目标
- 理解图形验证码的基本原理和常见类型
- 掌握 OCR(光学字符识别)工具 Tesseract 的基本用法
- 学会通过opencv等图像预处理手段提升验证码识别准确率
- 了解常见问题及解决方案
二、环境准备
识别验证码通常需要用到 OCR 技术。这里我们推荐使用 `pytesseract`,它是 Tesseract OCR 引擎的 Python 封装,配合 `Pillow` 进行图片处理。
2.1 安装依赖
在Python环境下,若想运用Tesseract实现光学字符识别功能,具体的安装方法涵盖了安装Tesseract OCR软件、引入Python库pytesseract以及配置环境变量等方面。
首先,Tesseract OCR软件是整个流程的基础,作为一款由Google维护的强大开源光学字符识别引擎,需要从其官方渠道获取与操作系统适配的版本并完成安装。具体而言:
(1)下载并安装Tesseract:
- 对于Windows用户,访问Tesseract OCR的GitHub页面( https://github.com/tesseract-ocr/tesseract )或windows安装包地址( https://github.com/UB-Mannheim/tesseract/wiki ),下载对应的可执行安装文件,按照安装提示逐步操作。
- macOS系统用户,借助Homebrew工具,在命令行中输入“brew install tesseract”即可完成安装。
- Linux用户则依据自身的发行版本,使用相应的包管理器,如通过“sudo apt-get install tesseract-ocr”命令来安装Tesseract OCR软件。
(2)确认安装:安装结束后,在命令行输入“tesseract -v”,若能显示版本相关信息,就表明Tesseract OCR软件安装成功。
其次,pytesseract作为Python的一个库,提供了与Tesseract OCR引擎交互的便捷接口,能让Python调用Tesseract的功能更为顺畅。其安装与验证步骤如下:
(1)安装pytesseract:打开命令行,执行“pip install pytesseract”命令,即可完成该库的安装。
(2)验证安装:在Python环境里,尝试执行“import pytesseract”语句,若未弹出错误提示,则意味着pytesseract库安装无误。
最后,为确保pytesseract能够准确找到Tesseract可执行文件,环境变量的设置至关重要:
(1)Windows:先确定Tesseract的安装路径,如“C:\Program Files\Tesseract-OCR”,接着右键点击“此电脑”,选择“属性”,进入“高级系统设置”,点击“环境变量”,在“系统变量”中找到“Path”变量进行编辑,将Tesseract的安装路径添加到其中。
(2)macOS和Linux:一般情况下,包管理器会自动配置路径,无需手动设置。但特殊情况下,可通过修改“~/.bash_profile”或“~/.bashrc”文件来手动添加Tesseract的路径。
2.2 验证安装
安装完成后,可通过以下代码验证环境是否正常:
import pytesseract
print(pytesseract.get_tesseract_version())
输出:
5.5.0.20241111
如果输出版本号,说明安装成功。
三、获取验证码图片
在实际项目中,验证码图片通常可以通过接口或页面下载。为了便于演示,我们假设已经将验证码图片保存为 `code.jpg`。
3.1 常见获取方式
- 接口下载:通过 API 获取验证码图片
- 页面抓取:使用 Selenium 或 Requests 从网页中提取验证码图片
- 手动保存:在测试阶段,可手动保存验证码图片
3.2 图片格式要求
- 支持常见格式:JPG、PNG、BMP 等
- 建议使用 PNG 格式,避免压缩损失
四、基础识别流程
4.1 基础流程
直接用 pytesseract 识别图片验证码非常简单:
import pytesseract
from PIL import Image
image = Image.open('code.jpg')
result = pytesseract.image_to_string(image)
print(result.strip())
旧版python的 `tesserocr` 库可以支持直接读取图片文件,如:
import tesserocr
print(tesserocr.file_to_text('code.jpg'))
但是我们使用的是 pytesseract 库。运行后即可输出识别结果:
JIR42.
准确率不高,或许tesserocr的正确率会高一点,我们继续往下探讨。
4.2 常见问题及解决方案
识别结果为空:检查图片是否清晰,尝试调整图片大小或对比度
识别错误:可能是图片干扰过多,需进行图像预处理
五、 图像预处理提升识别率
实际验证码往往会加入干扰线、噪点、颜色变化等,直接识别效果有限。此时可以通过图像预处理(如灰度化、二值化)来提升准确率。
5.1 灰度化
将彩色图片转为灰度,有助于去除颜色干扰:
image = image.convert('L') # 转为灰度图
image.show()
5.2 二值化
将灰度图进一步转为黑白图像,突出字符主体:
image = image.convert('1') # 默认阈值127
image.show()
5.3 自定义阈值二值化
有时需要手动调整阈值以获得更好效果:
image = image.convert('L')
threshold = 80 # 可根据实际图片调整
binary_table = [0 if i < threshold else 1 for i in range(256)]
image = image.point(binary_table, '1')
image.show()
5.4 其他预处理技巧
降噪:使用中值滤波或高斯滤波去除噪点
锐化:增强字符边缘,提高识别率
旋转校正:处理倾斜的验证码
六、综合识别流程示例
6.1 识别流程示例
完整识别流程如下:
import pytesseract
from PIL import Image
image = Image.open('code.jpg')
image = image.convert('L')
threshold = 127
binary_table = [0 if i < threshold else 1 for i in range(256)]
image = image.point(binary_table, '1')
result = pytesseract.image_to_string(image)
print(result)
输出:
JSR42
经过预处理后,正确率还是差一点。
6.2 进一步优化代码示例
优化方案:
(1)使用 OpenCV 进行灰度、二值化和去噪预处理
(2)用 pytesseract 限定只识别字母和数字,并设置 --psm 8 提高验证码识别率
import cv2
import pytesseract
def preprocess_opencv(image_path, threshold=130):
img = cv2.imread(image_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, thresh = cv2.threshold(gray, threshold, 255, cv2.THRESH_BINARY)
denoised = cv2.medianBlur(thresh, 3)
return denoised
# 使用示例
img = preprocess_opencv('code.jpg', threshold=130)
result = pytesseract.image_to_string(
img,
config='--psm 8 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
)
print(result.strip())
得到正确值:
JR42
继续以一张带有干扰线的验证码 `code2.jpg` 验证:
将代码中的 code.jpg 改成 code2.jpg,运行代码输出:
PFRT
到此准确率达到预期。
七、小结与建议
- 图形验证码识别的核心在于图像预处理,灰度化和二值化是最常用的手段。
- 阈值的选择对识别效果影响很大,可多尝试不同值。
- 对于更复杂的验证码(如扭曲、旋转、强干扰),可考虑进一步图像处理使用 opencv 或训练专用模型。
- tesserocr 或 pytesseract 适合简单验证码,遇到复杂场景可结合深度学习方法。
通过本节内容,你已经掌握了用 Python 自动识别基础图形验证码的完整流程。后续可以尝试识别更复杂的验证码类型,或将识别流程集成到自动化测试、爬虫等项目中。
八、常见问题解答
8.1 如何提高识别率?
- 确保图片清晰,避免模糊或压缩
- 调整阈值,找到最佳二值化效果
- 尝试多种预处理方法,如降噪、锐化等
8.2 遇到复杂验证码怎么办?
- 使用深度学习模型,如 CNN 或 RNN
- 结合传统图像处理与机器学习方法
- 考虑使用商业 OCR 服务
8.3 如何集成到爬虫项目?
- 将识别流程封装为函数,方便调用
- 结合 Selenium 或 Requests 自动获取验证码
- 处理识别失败的情况,如重试或人工干预
九、结语
图形验证码识别是自动化测试和爬虫开发中的基础技能。通过本节内容,你已经掌握了从环境搭建到图像预处理、再到完整识别流程的全面知识。希望这些内容能帮助你更好地应对实际项目中的图形验证码挑战。
看到这里了还不给博主点一个:
⛳️ 点赞
☀️收藏
⭐️ 关注
!
💛 💙 💜 ❤️ 💚💓 💗 💕 💞 💘 💖
再次感谢大家的支持!
你们的点赞就是博主更新最大的动力!