Python3爬虫中识别图形验证码的实例讲解


Posted in Python onJuly 30, 2020

本节我们首先来尝试识别最简单的一种验证码,图形验证码,这种验证码出现的最早,现在也很常见,一般是四位字母或者数字组成的,例如中国知网的注册页面就有类似的验证码,链接为:http://my.cnki.net/elibregister/commonRegister.aspx,页面:

Python3爬虫中识别图形验证码的实例讲解

表单的最后一项就是图形验证码,我们必须完全输入正确图中的字符才可以完成注册。

1.本节目标

本节我们就以知网的验证码为例,讲解一下利用 OCR 技术识别此种图形验证码的方法。

2. 准备工作

识别图形验证码需要的库有 Tesserocr,如果没有安装可以参考第一章的安装说明。

3. 获取验证码

为了便于实验,我们先将验证码的图片保存到本地,以供测试。

打开开发者工具,找到验证码元素,可以看到这是一张图片,它的 src 属性是 CheckCode.aspx,在这里我们直接将这个链接打开:http://my.cnki.net/elibregister/CheckCode.aspx,就可以看到一个验证码,直接右键保存下来即可,将名称命名为 code.jpg,如图 8-2 所示:

Python3爬虫中识别图形验证码的实例讲解

这样我们就可以得到一张验证码图片供下面测试识别使用了。

4. 识别测试

接下来我们新建一个项目,将验证码图片放到项目根目录下,用 Tesserocr 库来识别一下该验证码试试,代码如下:

import tesserocr
from PIL import Image
image = Image.open('code.jpg')
result = tesserocr.image_to_text(image)
print(result)

在这里我们首先新建了一个 Image 对象,然后调用了 Tesserocr 的 image_to_text() 方法,传入该 Image 对象即可完成识别,实现过程非常简单,识别结果如下:

JR42

另外 Tesserocr 还有一个更加简单的方法直接将图片文件转为字符串可以达到同样的效果,代码如下:

import tesserocr
print(tesserocr.file_to_text('image.png'))

不过经测试此种方法的识别效果不如上一种方法好。

5. 验证码处理

如上的图片识别基本没有难度,只是新建一个 Image 对象,然后调用 image_to_text() 方法即可得出图片的识别结果。

接下来我们换一个验证码试一下,命名为 code2.jpg,如图 8-3 所示:

Python3爬虫中识别图形验证码的实例讲解

重新用下面的代码测试一下:

import tesserocr
from PIL import Image
image = Image.open('code2.jpg')
result = tesserocr.image_to_text(image)
print(result)

这时可以看到如下输出结果:

FFKT

发现这次识别和实际的结果有所偏差,这是因为验证码内的多余线条干扰了图片的识别。

对于这种情况,我们还需要做一下额外的处理,如转灰度、二值化等操作。

我们可以利用 Image 对象的 convert() 方法参数传入 L 即可将图片转化为灰度图像,代码如下:

image = image.convert('L')
image.show()

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

image = image.convert('1')
image.show()

另外我们还可以指定二值化的阈值,上面的方法采用的是默认阈值127,不过我们不能用原图直接转化,可以先转为灰度图像,然后再指定二值化阈值转化,代码如下:

image = image.convert('L')
threshold = 80
table = []
for i in range(256):
    if i < threshold:
        table.append(0)
    else:
        table.append(1)
image = image.point(table, '1')
image.show()

在这里我们指定了一个变量 threshold 代表二值化阈值,阈值设置为 80,处理之后我们看一下结果,如图 8-4 所示:

Python3爬虫中识别图形验证码的实例讲解

经过处理之后我们发现原来的验证码中的线条已经被去除了,而且整个验证码变得黑白分明,这时重新识别验证码,代码如下:

import tesserocr
from PIL import Image
image = Image.open('code2.jpg')
image = image.convert('L')
threshold = 127
table = []
for i in range(256):
    if i < threshold:
        table.append(0)
    else:
        table.append(1)
image = image.point(table, '1')
result = tesserocr.image_to_text(image)
print(result)

即可发现运行结果变成了:

PFRT

识别正确。

可见对于一些有干扰的图片,我们做一些灰度和二值化处理,会提高其识别正确率。

6. 本节代码

本节代码地址为:https://github.com/Python3WebSpider/CrackImageCode。

7. 结语

本节我们了解了利用 Tesserocr 识别验证码的过程,对于简单的图形验证码我们可以直接用它来得到结果,如果要提高识别的准确度还可以对验证码图片做一下预处理。

以上就是Python3爬虫中识别图形验证码的实例讲解的详细内容,更多关于Python3爬虫识别图形验证码的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python运行报错UnicodeDecodeError的解决方法
Jun 07 Python
分享Python开发中要注意的十个小贴士
Aug 30 Python
分析python动态规划的递归、非递归实现
Mar 04 Python
Python Web版语音合成实例详解
Jul 16 Python
python 直接赋值和copy的区别详解
Aug 07 Python
使用Python调取任意数字资产钱包余额功能
Aug 15 Python
Python使用random模块生成随机数操作实例详解
Sep 17 Python
Python字典生成式、集合生成式、生成器用法实例分析
Jan 07 Python
pytorch方法测试详解——归一化(BatchNorm2d)
Jan 15 Python
Python在终端通过pip安装好包以后在Pycharm中依然无法使用的问题(三种解决方案)
Mar 10 Python
django 模型字段设置默认值代码
Jul 15 Python
Python中logging日志记录到文件及自动分割的操作代码
Aug 05 Python
Python3以GitHub为例来实现模拟登录和爬取的实例讲解
Jul 30 #Python
Python如何实现线程间通信
Jul 30 #Python
Python如何输出警告信息
Jul 30 #Python
Python设计密码强度校验程序
Jul 30 #Python
详解Pandas 处理缺失值指令大全
Jul 30 #Python
Python 爬虫的原理
Jul 30 #Python
Python爬虫与反爬虫大战
Jul 30 #Python
You might like
ThinkPHP CURD方法之table方法详解
2014/06/18 PHP
PHP中substr函数字符串截取用法分析
2016/01/07 PHP
PHP匿名函数和use子句用法实例
2016/03/16 PHP
php删除一个路径下的所有文件夹和文件的方法
2018/02/07 PHP
PHP+Redis开发的书签案例实战详解
2019/07/09 PHP
HTML IMG标签 onload 内存溢出导致浏览器CPU占用过高
2021/03/09 Javascript
在chrome浏览器中,防止input[text]和textarea在聚焦时出现黄色边框的解决方法
2011/05/24 Javascript
javascript面向对象编程代码
2011/12/19 Javascript
jquerymobile局部渲染的各种刷新方法小结
2014/03/05 Javascript
jquery等待效果示例
2014/05/01 Javascript
JS实现的自定义网页拖动类
2015/11/06 Javascript
js定时器实例分享
2016/12/20 Javascript
vue数据双向绑定的注意点
2017/06/23 Javascript
修改UA在PC中访问只能在微信中打开的链接方法
2017/11/27 Javascript
详解微信小程序input标签正则初体验
2018/08/18 Javascript
layui使用表格渲染获取行数据的例子
2019/09/13 Javascript
[04:41]2014DOTA2国际邀请赛 Liquid顺利突围晋级正赛
2014/07/09 DOTA
Python中比较特别的除法运算和幂运算介绍
2015/04/05 Python
使用Python生成XML的方法实例
2017/03/21 Python
Python入门_条件控制(详解)
2017/05/16 Python
Python代码缩进和测试模块示例详解
2018/05/07 Python
python爬虫之快速对js内容进行破解
2019/07/09 Python
基于css3实现漂亮便签样式
2013/03/18 HTML / CSS
解析HTML5的存储功能和web SQL的相关操作方法
2016/02/19 HTML / CSS
HTML5 canvas实现移动端上传头像拖拽裁剪效果
2016/03/14 HTML / CSS
Regatta官网:英国最受欢迎的户外服装和鞋类品牌
2019/05/01 全球购物
秘书岗位职责
2013/11/18 职场文书
活动志愿者自荐信
2014/01/27 职场文书
给老师的检讨书
2014/02/11 职场文书
运动会宣传口号
2014/06/09 职场文书
县政府领导班子“四风”方面突出问题整改措施
2014/09/23 职场文书
学习十八届四中全会依法治国心得体会
2014/11/03 职场文书
优秀少先队辅导员事迹材料
2014/12/24 职场文书
党员个人总结自评
2015/02/14 职场文书
2015年服务员个人工作总结
2015/05/27 职场文书
《圆明园的毁灭》教学反思
2016/02/16 职场文书