利用Python轻松搞定数字英文验证码,搞定Python反爬

Chapter15 | 验证码识别

  • 一、模拟登录知乎
  • 二、光学字符识别
  • 1、pytesseract2、验证码的识别3、图像处理3.1、二值图像3.2、灰度图像3.3、索引图像3.4、处理实例4、处理复杂验证
私信小编01即可获取大量Python学习资料
验证码(CAPTCHA)的全程为全自动区分计算机和人类的公开图灵测试从全程可以看出:验证码用于测试用户是否为真实人类以识别知乎验证码为例 , 介绍简单的验证码处理
一、模拟登录知乎
  • 如果访问过于频繁 , 服务器要求输入验证码
  • 如果短时间内在知乎上频繁地登录退出 , 知乎就会要求输入验证码
对于比较简单的字符型验证码 , 可以尝试用pytesseract库识别这些验证码pytesseract是一款用于光学字符识别的Python第三方库 , 可以从图片中识别出其中嵌入的文字我们可以看到有些验证码是识别不出来的 。
  • 随着计算能力和机器学习的发展 , 涌现出很多新型验证码 , 使得验证码处理越来越难 。 如下图:
  • 验证码的识别是一个专门的研究领域 , 对于普通用户来说 , 要采用合适的抓取策略 , 尽量避免验证码的出现 。
二、光学字符识别光学字符识别(Optical Character Recognition , OCR) 用于从图像中抽取文本我们使用开源的Tesseract OCR引擎 , 该引擎最初由惠普公司开发 , 目前由Google主导在验证码识别中 , 使用Python的封装版本pytesseract
1、pytesseract官网:函数:image_to_string()用法:print(pytesseract.image_to_string(Image.open(“test.png”)))
  • pytesseract是一个基于Google‘s Tesseract-OCR的独立封装包
  • pytesseract功能是识别图片文件中文字 , 并作为返回参数返回识别结果
  • pytesseract默认支持tiff、bmp格式图片 , 只有在安装PIL之后 , 才能支持jpeg、gif、png等其他图片格式
PIL提供了通用的图像处理功能 , 以及大量有用的基本图像操作 , 比如图像缩放、裁剪、旋转、颜色转换等 。 利用PIL中函数 , 我们可以从大多数图像格式的文件中读取数据 , 然后写入最常见的图像格式文件中PIL中最重要的模块为Image
我们要先安装PIL:pip install Pillow-7.1.1-cp36-cp36m-win_amd64.whlPIL的open()函数用于创建PIL图像对象下面开始进行测试:
from PIL import Imagefrom PIL.ImageShow import show# 读取图片img = Image.open(".\\3.png")# 显示图片show(img)下图为测试运行的图片
利用Python轻松搞定数字英文验证码,搞定Python反爬文章插图
输出图片格式 img.format输出图片尺寸 img.size输出图片类型 img.mode
# 输出图片的格式 , 尺寸以及图像类型print(img.format,img.size,img.mode)
利用Python轻松搞定数字英文验证码,搞定Python反爬文章插图
  • 生成缩略图img.thumbnail()
# 生成缩略图img.thumbnail((128,128))# 显示图片show(img)要旋转一张图片 , 可以使用逆时针方式表示旋转角度 , 然后调用rotate()函数当旋转角度为90° , 180° , 270°的时候可以用img.transpose(Image.ROTATE_90)其他角度用rotate()
# 逆时针旋转45°rorate1 = img.rotate(45)show(rorate1)# 逆时针旋转90°rorate1 = img.transpose(Image.ROTATE_90)show(rorate2)左右对换 img.transpose(Image.FLIP_LEFT_RIGHT)上下翻转 img.transpose(Image.FLIP_TOP_BOTTOM)
# 左右对换rorate3 =img.transpose(Image.FLIP_LEFT_RIGHT)show(rorate3)# 上下翻转rorate4 = img.transpose(Image.FLIP_TOP_BOTTOM)show(rorate4)图像的颜色转换可以使用convert()方法来实现 。 要读取一幅图像 , 并将其转换成灰色图像 , 只需要加上convert('L')
# 图像转换为灰度grey = img.convert('L')
利用Python轻松搞定数字英文验证码,搞定Python反爬文章插图
利用Python轻松搞定数字英文验证码,搞定Python反爬文章插图
Python规定左上角为(0,0)的坐标点 , box由一个4元组(左 , 上 , 右 , 下)定义 , 表示为坐标为:(left,upper,right,lower),最后的两个数字必须比前面两个要大
# 裁剪如片 box为裁剪图片的区域范围box = (30,30,100,100)region = img.crop(box)show(region)
利用Python轻松搞定数字英文验证码,搞定Python反爬文章插图
2、验证码的识别from PIL import Imagefrom PIL.ImageShow import showimport pytesseract# 读取图片img = Image.open(".\\2.png")# 显示图片show(img)print(pytesseract.image_to_string(img))
利用Python轻松搞定数字英文验证码,搞定Python反爬文章插图
3、图像处理在用pytesseract进行验证码识别之前 , 我们首先需要对验证码图片进行预处理 , 尽量去除噪声 , 而只保留有验证码信息的像素pytesseract基本上无法识别那些没有经过预处理的验证码图片下面为一些基本的验证码预处理方法: