微信号:PythonTZXY

介绍:每天更新,更新python相关的知识.希望诸君有所收获!

看看资深程序员是如何教你破解图形验证码!这不很简单嘛!

2018-06-12 16:09 Python学习交流


1)图形验证码

图形验证码应该是最简单的一种验证码,这种验证码是最早出现,也是目前最常见的,一般组成规则是4个字母或数字或混合组成;


2)滑动验证码


3)点触验证码





下面这种,下2篇文章会介绍;


识别图形验证码需要安装 tesserocr 这个库,下面介绍下tesserocr;


3 环境准备

windows下的安装

在Windows下,要先下载tesseract,它为tesserocr提供了支持;

tesseract下载地址:https://digi.bib.uni-mannheim.de/tesseract/

打开后,可以看到各种exe的列表,可以随便挑选;

其中文件名中带有dev的为开发版本,不带dev则为稳定版本,例如jb是下载 tesseract-ocr-setup-3.05.01.exe;


下载后双击,一路点击,直到出现下面这个页面




如何验证tesseract是否安装成功?直接cmd下输入tesseract即可;

成功会直接显示信息;


如果提示'tesseract' 不是内部或外部命令,则是因为没有配置环境变量,手动把tesseract根目录配置到path参数下即可,这块不详细说明;

到此为止,tesseract安装成功啦~

接下来就 安装tesserocr ,直接pip命令即可:

pip3 install tesserocr install

但jb在安装的时候,直接报错:


试过很多种方式,就算使用conda install tesserocr,也一样报错。


经历千辛万苦,终于找到一条可行的命令:

conda install -c simonflueckiger tesserocr


最终就安装上tesserocr啦~

如何验证是否真的安装了?很简单,直接import tesserocr,不报错就说明安装好了;



在不同发行版本运行如上命令,即可完成tesseract的安装;

安装完成后,便可以调用tesseract命令;

默认也是指安装英文语言,如果需要安装其他语言,请看下上面Windows的介绍,一样的处理方案,这里不重复说明;

接下来就是安装tesserocr,直接使用pip安装:

pip3 install tesserocr pillow

Mac下的安装

在Mac下,首先使用Homebrew 安装ImageMagick 和tesseract库:

brew install imagemagickbrew install tesseract --all-languages

接下来再安装tesserocr即可:

brew install tesserocr pillow




ok,完事具备,那就开始吧,新建项目,把验证码放到项目根目录下;

用tesserocr库来识别验证码:

import tesserocrfrom PIL import Image#新建Image对象image = Image.open("3.jpg")#调用tesserocr的image_to_text()方法,传入image对象完成识别result = tesserocr.image_to_text(image)print(result)


结果,运行后,啥都没有???

接下来jb陷入了困扰,包括调试,找各种文档,最终,把上面调试的验证码换了一个:


替换下图片,再执行一次代码:


OK,看到是有数据了,不过输出的是MEEE,跟验证码的ME8E还是有点不一样;

目前两个问题:



结果也跟上面的一样,但网上不建议这么用,原因是据说这种识别效果不如上一种的好;

关于微博验证码为空,使用tesseract输出下原因:

tesseract 图片路径 output


leptonica 在解析时没有检测到任何dpi;

5 验证码处理

网上找了下信息,比如这张验证码:


可能是验证码内的多余线条干扰了图片的识别;

又比如微博这张:




图片成功转灰了;此时我们再校验一下,发现校验还是MEEE,失败;


传入1的后,即可将图片进行二值化处理:

(二值化是指将图像上的像素点的灰度值设置为0或255,也就是将整个图片呈现出明显的只有黑和百的视觉效果)

import tesserocrfrom PIL import Imageimage = Image.open("1.jpg")image = image.convert('1')image.show()


这个一看,比上面更模糊了,理所当然的,校验结果会错的更加离谱:



这里说明下,可能有同学对256不明白,这是什么?

首先,我们是把图片置灰处理,灰度图像是一种具有从黑到白256级灰度色阶或等级的单色图像;

对于灰度图像利用阈值得到二值化的图像, 也就是说,我们设定了一个阈值,从0到256,如果灰度图像少于阈值则设置0,大于阈值则设置1,0是黑色,1是白色,这样做,就可以把一个灰度图完全转换二值化图;

可能还是懵逼,直接贴图:

原图


灰度图:


二值图:


在灰度图上,部分色彩是介于白色跟黑色之间,所以通过设置阈值的方法,把这些中间色彩全部转换成黑色跟白色;

ok,扯远了,上面把验证码二值图后是长这样的:


而校验结果:


good,有所变化, 至少不是MEEE了,那我们继续调,调到一个合适的值;

调了半天,jb放弃了,原因是这个8,不管怎么调都调不到一个合适的值,一直在S、R、B之间徘徊;

JB换了个验证码:

上面同样的代码,无修改,二值图如下:


校验结果:


oh year,这个能校验出来了~

还记得我们一开始那个微博验证码吗?我们也来试试,处理后的验证码是这样的~


结果校验的时候,基本上都空,只有在138的时候会有一点点识别效果,但是压根不搭边;


对比了下,微博验证码跟上面能识别的验证码:



能别识别的,是实心,而不能被识别的,是空心;

实心的好处在于,图像处理后,黑白分明,但是空心在图像处理后,由于线条本来就很细,处理后可能都识别不出来了;

6 小结

本章学习了tesserocr及tesseract的环境搭建,以及如何对图形验证码进行噪音处理,并且讲解灰色图跟二值图的概念;

7 疑难杂症

实际发现,tesserocr仅能解决实心的验证码,对于空心的验证码,依然束手无策,那怎么办呢?

既然图像识别存在误差,那我们就放弃这条路,而是通过其他的方式来获取这个验证码;

比如直接找到生成这验证码的代码二次转化获取验证码,深度学习训练机器识别;

下章预告:

如何获取验证码的生成代码二次处理获取验证码

谢谢大家~

进群:125240963  即可获取源码

 
Python学习交流 更多文章 谁当年还没看过几本小说!我用Python爬取全站的的小说! 用Python开发一个银行系统!说不定下一个银行系统就是你开发的! Pycharm是最牛逼的编辑器!小白如何快速上手?这是最完整的教程 如果利用Python爬取B站上千万数据?B站直播都是大屌萌妹吗? 利用Python做毕业设计,基于python的智能化门禁系统,远程控制!
猜您喜欢 关于敏捷测试中AC和TC的那些事儿(一) HTML特殊字符编码大全 为什么这么久没发文章呢?原来是摊上大事啦! [八卦内幕] 一个前快播员工眼中的快播 深入理解javascript中的作用域(一)