中软首页
●  教育部授予:“软件工程专业大学生实习实训基地”资质
●  商务部授予:“中国服务外包示范培训中心”资质
●  工信部授予:国家信息技术紧缺人才培养工程“521计划”资格
●  获得腾讯授予:中国IT教育十大影响力品牌

≡ 技术知识库
当前位置:网站首页>技术知识库>>文章内容
如何用Python巧妙识别web验证码
作者:   来源:    时间:2016-12-08 10:51:48    字体:[大] [中] [小]

     在看这篇文章之前同学们可能会觉得很多时候因为web验证码的随机性无法实现自动化登录,看了这篇文章,我相信你也会跟小卓一样,运用熟悉的Python来识别web验证码。

     这篇文章主要是用Python的分割图片原理利用浏览器截屏功能来识别web验证码一些方法的整理,还有几个地方大家可以按自己的想法来更改,大家都可以试试看哦!






获取训练数据

训练数据直接用urllibweb上抓取验证码的图片。这些图片首先要进行灰度化处理,然后根据阀值将灰度图二值化,片变成黑白图片,代码如下:

网页上原始数据:

处理过的图片如下:

分割图片

二值化后的图片需要拆分,将每个数字拆分到单独的图片中,通常采用的是x轴投影的办法拆分数字的,代码如下:

分割后的图片如下:

X轴投影分割原理:

 

当然这种方法缺点也是有的,这样的数据就不能正确分割成四个数字的,更好的算法是连通图算法。(大家可以自己尝试一下)


整理训练数据作为样本

本来还需要对数字进行一些标准化的运算,对随机旋转,随机扭曲,随机缩放的标准化有不同的算法,为了简单处理,只对缩放进行标准化,也就是把每张图片resize到相同的大小。

然后将这些数字人为的识别,放到对应的目录中(由于算法比较简陋,为了准确率高,抽样的数据尽量多,这样是把0-9每个数字放50个样本)


识别验证码

有了这些样本数据,我们就可以开始识别验证码了,使用selenium封装的chromedriver控制chrome浏览器打开登录界面,验证码的url每次得到的图片是不同的,也不能直接用urllib.openurl打开的src,所以这里需要使用到selenium的截图功能。

截图不能截局部图,只能截整个浏览器。

截图分割,然后将单独的数字与样本数据对比,这里采用简单的算法,逐个像素对比,相同像素多的即为结果。 代码如下:



结果

测试了一下这个程序,识别率大概50%,作为自动化测试登录流程算是可以使用了,10次之内就可以登录;但是如果用到12306这样的网站上抢火车票的话就不太能接受了。

可以优化的地方有很多,如字符分割、标准化算法等,大家以后有时间可以再慢慢研究,改进一下方案,欢迎大家给我们投稿哦!


























中软国际教育科技微网页二维码
版权所有 © 2008-2014 北京中软国际教育科技股份有限公司 京ICP备09078625号-2 京公安备11010802014778号 隐私声明 | 联系我们 | 网站地图

华东

华南

华中

华北

西北

西南

东北