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网站验证码识别
Jan 25 Python
Python简单遍历字典及删除元素的方法
Sep 18 Python
python将秒数转化为时间格式的实例
Sep 16 Python
python微信撤回监测代码
Apr 29 Python
PyQt5 加载图片和文本文件的实例
Jun 14 Python
Django框架model模型对象验证实现方法分析
Oct 02 Python
详解python中*号的用法
Oct 21 Python
PyTorch中 tensor.detach() 和 tensor.data 的区别详解
Jan 06 Python
TensorFlow实现从txt文件读取数据
Feb 05 Python
Python virtualenv虚拟环境实现过程解析
Apr 18 Python
python爬虫 requests-html的使用
Nov 30 Python
pandas按条件筛选数据的实现
Feb 20 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自带方法生成静态html文件详解
2014/06/13 PHP
采用ThinkPHP中F方法实现快速缓存实例
2014/06/13 PHP
JavaScript高级程序设计 客户端存储学习笔记
2011/09/10 Javascript
JavaScript高级程序设计 阅读笔记(二十) js错误处理
2012/08/14 Javascript
禁止你的左键复制实用技巧
2013/01/04 Javascript
JS 各种网页尺寸判断实例方法
2013/04/18 Javascript
javascript 得到文件后缀名的思路及实现
2020/05/09 Javascript
jQuery 获取浏览器所在的IP地址的小例子
2013/11/08 Javascript
jQuery插件开发的两种方法及$.fn.extend的详解
2014/01/16 Javascript
Jquery弹出层插件ThickBox的使用方法
2014/12/09 Javascript
jQuery实现的向下图文信息滚动效果
2015/05/03 Javascript
Javascript中typeof 用法小结
2015/05/12 Javascript
JavaScript中的some()方法使用详解
2015/06/09 Javascript
jquery实现很酷的网页顶部图标下拉菜单效果
2015/08/22 Javascript
基于PHP和Mysql相结合使用jqGrid读取数据并显示
2015/12/02 Javascript
理解javascript定时器中的setTimeout与setInterval
2016/02/23 Javascript
JavaScript实现iframe自动高度调整和不同主域名跨域
2016/02/27 Javascript
微信小程序 使用picker封装省市区三级联动实例代码
2016/10/28 Javascript
vue鼠标移入添加class样式,鼠标移出去除样式(active)实现方法
2018/08/22 Javascript
vue基于better-scroll仿京东分类列表
2020/06/30 Javascript
python中zip()方法应用实例分析
2016/04/16 Python
Python minidom模块用法示例【DOM写入和解析XML】
2019/03/25 Python
python绘制彩虹图
2019/12/16 Python
python实现根据给定坐标点生成多边形mask的例子
2020/02/18 Python
Python持续监听文件变化代码实例
2020/07/22 Python
Django如何批量创建Model
2020/09/01 Python
Python通过getattr函数获取对象的属性值
2020/10/16 Python
python中用ctypes模拟点击的实例讲解
2020/11/26 Python
canvas生成带二维码海报的踩坑记录
2019/09/11 HTML / CSS
世界上最大的曲棍球商店:Pro Hockey Life
2017/10/30 全球购物
如何写出高性能的JSP和Servlet
2013/01/22 面试题
SQL Server数据库笔试题和答案
2016/02/04 面试题
工作分析计划书
2014/04/30 职场文书
小学生迎国庆演讲稿
2014/09/05 职场文书
酒会邀请函
2015/01/31 职场文书
瞿秋白纪念馆观后感
2015/06/10 职场文书