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

所属分类: 脚本专栏 / python 阅读数: 1509
收藏 0 赞 0 分享

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

a0127ab16c0f31d7781e3cadafa4ab8.png

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

1.本节目标

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

2. 准备工作

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

3. 获取验证码

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

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

ab639aae49160a15847b83a5779b691.png

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

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 所示:

1a8a0b6b16372b48e23879d55fd5bdf.png

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

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 所示:

fe4e8d65503415930aa9d6ad720f9f9.png

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

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中的对象与类型,涉及到对象的引用计数方法和类型的定义等深层次内容,需要的朋友可以参考下
收藏 0 赞 0 分享

一篇文章入门Python生态系统(Python新手入门指导)

原文写于2011年末,虽然文中关于Python 3的一些说法可以说已经不成立了,但是作为一篇面向从其他语言转型到Python的程序员来说,本文对Python的生态系统还是做了较为全面的介绍
收藏 0 赞 0 分享

Python实时获取cmd的输出

本文给大家分享python实时获取cmd的输出,对python实时获取输出相关知识感兴趣的朋友一起学习吧
收藏 0 赞 0 分享

分享Python字符串关键点

字符串是 Python 中最常用的数据类型。我们可以使用引号来创建字符串,通过本篇文章给大家分享python字符串关键点相关资料,感兴趣的朋友一起学习吧
收藏 0 赞 0 分享

Python中内置数据类型list,tuple,dict,set的区别和用法

这篇文章主要给大家介绍了Python中内置数据类型list,tuple,dict,set的区别和用法,都是非常基础的知识,十分的细致全面,有需要的小伙伴可以参考下。
收藏 0 赞 0 分享

Python学习笔记整理3之输入输出、python eval函数

这篇文章主要介绍了Python学习笔记整理3之输入输出、python eval函数的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

十个Python程序员易犯的错误

不管是在学习还是工作过程中,人都会犯错。虽然Python的语法简单、灵活,但也一样存在一些不小的坑,一不小心,初学者和资深Python程序员都有可能会栽跟头。本文为大家分享了10大常见错误,需要的朋友可以参考下
收藏 0 赞 0 分享

使用Python编写简单的端口扫描器的实例分享

这篇文章主要介绍了使用Python编写简单的端口扫描器的实例分享,文中分别介绍了单线程和多线程的实现方式,需要的朋友可以参考下
收藏 0 赞 0 分享

用ReactJS和Python的Flask框架编写留言板的代码示例

这篇文章主要介绍了用ReactJS和Python的Flask框架编写留言板的代码示例,其他的话用到了MongoDB这个方便使用JavaScript来操作的数据库,需要的朋友可以参考下
收藏 0 赞 0 分享

在DigitalOcean的服务器上部署flaskblog应用

这篇文章主要介绍了在DigitalOcean的服务器上部署flaskblog的方法,flaskblog是用Python的Flask开发的一个博客程序,而DigitalOcean则是大受欢迎的SSD主机提供商,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多