目前,许多网站采取各种各样的措施来反爬虫,其中一个措施是使用验证码。随着技术的发展,验证码的花样越来越多。验证码最初是几个数字组合的简单的图形验证码,后来加入了英文字母和混淆曲线。有的网站还可能看到中文字符的验证码。

后来 12306 验证码的出现使得行为验证码开始发展起来,用过 12306 的用户肯定多少为它的验证码头疼过。我们需要识别文字,点击与文字描述相符的图片,验证码完全正确,验证才能通过。现在这种交互式验证码越来越多,如极验滑动验证码需要滑动拼合滑块才可以完成验证,点触验证码需要完全点击正确结果才可以完成验证,另外还有滑动宫格验证码、计算题验证码等。

图形验证码的识别

图形验证码,是最简单的一种验证码,这种验证码最早出现,现在也很常见,一般由 4 位字母或者数字组成。例如,中国知网的注册页面有类似的验证码,链接为 http://my.cnki.net/elibregister/commonRegister.aspx,如下图:

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

因此这里我们讲解一种能将图片翻译成文字的技术。将图片翻译成文字一般被称为光学文字识别(Optical Character Recognition),简写为OCR。

本节目标

以知网的验证码为例,利用 OCR 技术识别图形验证码。

准备工作

识别图形验证码需要库 tesserocr 。因此需要提前进行安装。

获取验证码

为了便于实验,我们先将验证码的图片保存到本地。打开开发者工具,找到对应的验证码元素。验证码元素是一张照片,它的src属性是 CheckCode.aspx 。我们打开这个链接后将其保存为图片格式,命名为 code.jpg。

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

识别测试

接下来新建一个项目,将验证码图片放到项目根目录下,使用 tesserocr 库识别验证码,代码如下:

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

这里我们新建了一个 Image 对象,然后调用 tesserocr 的 image_to_text() 方法。传入该 Image 对象即可完成识别。结果如下所示:


另外,tesserocr 还有一个更加简单的方法,这个方法可以直接将图片文件转为字符串,代码如下:

import tesserocrprint(tesserocr.file_to_text('code.jpg'))

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

验证码处理

接下来我们换一个验证码,将其命名为 code2.jpg,如下图:

重新使用之前的代码来测试:

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

可以看到如下输出结果:


这次识别和实际结果有偏差,这是因为验证码内的多余线条干扰了图片的识别。对于这种情况,我们还需要做一下额外的处理,如转灰度、二值化等操作。

# 我们可以使用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。然后通过 point() 方法将其做二值化处理。结果如下:

我们发现原来验证码中的线条已经去除,整个验证码变得黑白分明。这时重新识别验证码,代码如下:

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

运行结果如下:

那么,针对一些有干扰的图片,我们可以做一些灰度和二值化处理,这样会提高图片识别的正确率。

简单图形验证码的识别相关推荐

  1. 对登录接口的简单图形验证码进行识别 20221004

    Python黑客编程原理与实战--作业(二) 1/编程题 \1. 语言限定为python3 环境准备,使用虚拟python3环境 pip3 install virtualenv virtualenv ...

  2. Class 18 - 1 图形验证码的识别

    一.图形验证码的识别 先将验证码的图片保存到本. 打开开发者工具,找到验证码元素.验证码元素是一张图片,src 属性是 CheckCode.aspx.打开链接 http://my.cnki.net/e ...

  3. 利用pytesser识别简单图形验证码

    转自:https://my.oschina.net/jhao104/blog/647326 一.探讨 识别图形验证码可以说是做爬虫的必修课,涉及到计算机图形学,机器学习,机器视觉,人工智能等等高深领域 ...

  4. python图形验证码识别_Python验证码识别:利用pytesser识别简单图形验证码

    一.探讨 识别图形验证码可以说是做爬虫的必修课,涉及到计算机图形学,机器学习,机器视觉,人工智能等等高深领域-- 简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形.以及利用计算机进行 ...

  5. html的表单图形验证码怎么做,django中简单图形验证码实现

    要实现django图形验证码,可以使用简单的captcha 一.安装captcha 在Pycharm的terminal中,使用pip安装第三方库: 执行命令: pip install django-s ...

  6. 爬虫从入门到精通(15) | 使用Python-OCR识别库对图形验证码进行识别

    文章目录 一.tesseract破解验证码 1.下载安装tesseract 2.python安装tesseract模块及其配置 3.demo测试 二.muggle_ocr破解和识别验证码 1.介绍 2 ...

  7. 三十四、使用pytesser3 和pillow完成图形验证码的识别

    @Author: Runsen 文章目录 灰度化 二值化 降噪 灰度化 像素点是最小的图片单元,一张图片由很多像素点构成,一个像素点的颜色是由RGB三个值来表现的,所以一个像素点对应三个颜色向量矩阵, ...

  8. 网络爬虫笔记—图形验证码识别

    网络爬虫笔记-图形验证码识别 <兄弟们,本文章开启了关注后阅读.大家如不想关注,可直接微信搜索"宏蜘蛛"或文章标题,查看文章.> 1.什么是图形验证码 像知网注册界面的 ...

  9. 验证码的识别(极验验证码)

    本文介绍了几种常见的验证码类型以及它们的识别方法,包括图形验证码.极验滑动验证码.点触验证码和微博宫格验证码等.其中,针对图形验证码的识别方法是使用OCR技术,并且需要安装tesserocr库.我们可 ...

  10. 第八部分 验证码的识别(极验验证码)

    前言: 验证码是众多网站采取的反爬措施.验证码的花样也很多,主要有下面这几种类验证码: 图形验证码:数字.英文字母.混淆曲线组合成的验证码. 行为验证码:识别文字,点击与文字相符的图片验证码. 交互式 ...

最新文章

  1. UISegmentedControl的详细使用
  2. BrowserSync前端同步测试工具
  3. 12v驱动光耦用多大的电阻_倍思10000mAh PD快充充电宝拆解,内置多合一双向快充芯片...
  4. Hyperledger Fabric 1.0 从零开始(十二)——fabric-sdk-java应用【补充】
  5. iOS: 教你给UI控件添加Badge(消息提醒小圆点)
  6. 四大障碍将阻止或减缓广电发展宽带业务
  7. 地理信息系统教程(汤国安)——重点总结
  8. word文档打印表格时预览时看的到表格打印出来的表格没有上下两根横线?
  9. Linux CentOS安装增强功能--完整版命令
  10. PCI E 阻抗85/100
  11. 版署通过《魔兽世界.燃烧远征》
  12. Java 8 新特性——实践篇
  13. C++如何实现二进制数据存储为灰度图
  14. TCP/IP模型以及OSI七层参考模型各层的功能介绍和主要协议
  15. linear-gradient实现纯CSS文字淡入效果
  16. 【docker系列】容器自启动与守护进程停止后容器保活
  17. 推荐一个好用的OKR工具
  18. portraiture中文版下载切换教程v3.5.6版本
  19. 怎样知道mysql的驱动是什么_MySQL连接查询到底什么是驱动表?看了这里你应该就明白了...
  20. C++静态成员对象与静态成员函数

热门文章

  1. IOS 微信端 视频自动播放问题解决方法
  2. 计算机主机配置一般有机箱主板cpu,组装台式电脑配置清单
  3. 记分牌调度算法实现java_动态调度算法:记分牌算法和tomasulo算法
  4. Theano简单入门(三)
  5. oracle11g 测试io,IO性能测试 1:Oracle ORION
  6. OpenCV(三)彩色图灰度化、通道分离、单通道反差处理(灰度图)、多通道反差处理(彩色图)
  7. Python实现草莓熊手拿风车和鲜花
  8. 耳机在电脑上测试有声音,但是网页和视频没有声音
  9. vim插件管理利器:pathogen
  10. 【Python百日进阶-Web开发-Feffery】Day418 - fac实例:dash+fac登录-Sqlite数据库