前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python | 用机器学习搞定数字验证码,还有谁?!

Python | 用机器学习搞定数字验证码,还有谁?!

作者头像
用户1634449
发布于 2018-12-18 07:37:14
发布于 2018-12-18 07:37:14
2K00
代码可运行
举报
文章被收录于专栏:Python专栏Python专栏
运行总次数:0
代码可运行

作者:roy

来源:http://www.hi-roy.com/2017/09/19/Python验证码识别

1.

写爬虫有一个绕不过去的问题就是验证码,现在验证码分类大概有4种:

1. 图像类

2. 滑动类

3. 点击类

4. 语音类

今天先来看看图像类,这类验证码大多是数字、字母的组合,国内也有使用汉字的。在这个基础上增加噪点、干扰线、变形、重叠、不同字体颜色等方法来增加识别难度。 相应的,验证码识别大体可以分为下面几个步骤:

1. 灰度处理

2. 增加对比度(可选)

3. 二值化

4. 降噪

5. 倾斜校正分割字符

6. 建立训练库

7. 识别

由于是实验性质的,文中用到的验证码均为程序生成而不是批量下载真实的网站验证码,这样做的好处就是可以有大量的知道明确结果的数据集。 当需要真实环境下需要获取数据时,可以使用结合各个大码平台来建立数据集进行训练。

2.

生成验证码这里我使用Claptcha这个库,当然Captcha这个库也是个不错的选择。

为了生成最简单的纯数字、无干扰的验证码,首先需要将claptcha.py的285行_drawLine做一些修改,我直接让这个函数返回None,然后开始生成验证码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from claptcha import Claptcha

c = Claptcha("8069","/usr/share/fonts/truetype/freefont/FreeMono.ttf")
t,_ = c.write('1.png')

这里需要注意ubuntu的字体路径,也可以在网上下载其他字体使用。生成验证码如下:

可以看出,验证码有形变。对于这类最简单的验证码,可以直接使用谷歌开源的tesserocr来识别。

首先安装:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apt-get install tesseract-ocr libtesseract-dev libleptonica-dev
pip install tesserocr

然后开始识别:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from PIL import Image
import tesserocr

p1 = Image.open('1.png')
tesserocr.image_to_text(p1)

'8069\n\n'

可以看出,对于这种简单的验证码,基本什么都不做识别率就已经很高了。有兴趣的小伙伴可以用更多的数据来测试,这里我就不展开了。

3.

接下来,在验证码背景添加噪点来看看:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
c = Claptcha("8069","/usr/share/fonts/truetype/freefont/FreeMono.ttf",noise=0.4)
t, _ = c.write('2.png')

生成验证码如下:

识别:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
p2 = Image.open('2.png')
tesserocr.image_to_text(p2)
'8069\n\n'

效果还可以。接下来生成一个字母数字组合的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
c2 = Claptcha("A4oO0zZ2","/usr/share/fonts/truetype/freefont/FreeMono.ttf")
t,_ = c2.write('3.png')

生成验证码如下:

第3个为小写字母o,第4个为大写字母O,第5个为数字0,第6个为小写字母z,第7个为大写字母Z,最后一个是数字2。人眼已经跪了有木有!但现在一般验证码对大小写是不做严格区分的,看自动识别什么样吧:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
p3 = Image.open('3.png')
tesserocr.image_to_text(p3)
'AMOOZW\n\n'

人眼都跪的计算机当然也废了。但是,对于一些干扰小、形变不严重的,使用tesserocr还是十分简单方便的。

4.

然后将修改的claptcha.py的285行_drawLine还原,看添加干扰线的情况。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
p4 = Image.open('4.png')
tesserocr.image_to_text(p4)
''

加了条干扰线就完全识别不出来了,那么有没有什么办法去除干扰线呢?

虽然图片看上去是黑白的,但还需要进行灰度处理,否则使用load()函数得到的是某个像素点的RGB元组而不是单一值了。处理如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def binarizing(img,threshold):
    """传入image对象进行灰度、二值处理"""
    img = img.convert("L") # 转灰度
    pixdata = img.load()
    w, h = img.size
    # 遍历所有像素,大于阈值的为黑色
    for y in range(h):
        for x in range(w):
            if pixdata[x, y] < threshold:
                pixdata[x, y] = 0
            else:
                pixdata[x, y] = 255
    return img

处理后的图片如下:

可以看出处理后图片锐化了很多。

5.

接下来尝试去除干扰线,常见的4邻域、8邻域算法。

所谓的X邻域算法,可以参考手机九宫格输入法,按键5为要判断的像素点,4邻域就是判断上下左右,8邻域就是判断周围8个像素点。如果这4或8个点中255的个数大于某个阈值则判断这个点为噪音,阈值可以根据实际情况修改。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def depoint(img):
    """传入二值化后的图片进行降噪"""
    pixdata = img.load()
    w,h = img.size
    for y in range(1,h-1):
        for x in range(1,w-1):
            count = 0
            if pixdata[x,y-1] > 245:#上
                count = count + 1
            if pixdata[x,y+1] > 245:#下
                count = count + 1
            if pixdata[x-1,y] > 245:#左
                count = count + 1
            if pixdata[x+1,y] > 245:#右
                count = count + 1
            if pixdata[x-1,y-1] > 245:#左上
                count = count + 1
            if pixdata[x-1,y+1] > 245:#左下
                count = count + 1
            if pixdata[x+1,y-1] > 245:#右上
                count = count + 1
            if pixdata[x+1,y+1] > 245:#右下
                count = count + 1
            if count > 4:
                pixdata[x,y] = 255
    return img

处理后的图片如下:

好像……根本没卵用啊?!确实是这样的,因为示例中的图片干扰线的宽度和数字是一样的。

6.

对于干扰线和数据像素不同的,比如Captcha生成的验证码:

从左到右依次是原图、二值化、去除干扰线的情况,总体降噪的效果还是比较明显的。另外降噪可以多次执行,比如我对上面的降噪后结果再进行依次降噪,可以得到下面的效果:

再进行识别得到了结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
p7 = Image.open('7.png')
tesserocr.image_to_text(p7)
'8069 ,,\n\n'

另外,从图片来看,实际数据颜色明显和噪点干扰线不同,根据这一点可以直接把噪点全部去除,这里就不展开说了。

第一篇文章,先记录如何将图片进行灰度处理、二值化、降噪,并结合tesserocr来识别简单的验证码,剩下的部分在下一篇文章中和大家一起分享。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-11-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python专栏 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
验证码的识别
概要:在爬虫中我们时常会碰见登录时候需要识别验证码的问题, 当然,验证码有很多,本篇文章只说最普通的图片验证码。 1、首先需要下载OCR OCR,光学字符识别,作用是通过扫描图片,将其转换为文本。 百
不断折腾
2019/09/23
1.7K0
验证码的识别
字符型验证码识别
在开发爬虫的过程中会遇到一种常见的反爬措施,验证码。验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。
润森
2019/09/05
1.8K0
字符型验证码识别
【爬虫系列】1. 无事,Python验证码识别入门
代码地址:https://github.com/liguobao/python-verify-code-ocr
李国宝
2021/08/07
4590
用Python机器学习搞定验证码
写爬虫有一个绕不过去的问题就是验证码,现在验证码分类大概有4种: 图像类 滑动类 点击类 语音类 今天先来看看图像类,这类验证码大多是数字、字母的组合,国内也有使用汉字的。在这个基础上增加噪点、干扰线、变形、重叠、不同字体颜色等方法来增加识别难度。 相应的,验证码识别大体可以分为下面几个步骤: 灰度处理 增加对比度(可选) 二值化 降噪 倾斜校正分割字符 建立训练库 识别 由于是实验性质的,文中用到的验证码均为程序生成而不是批量下载真实的网站验证码,这样做的好处就是可以有大量的知道明确结果的数据集。 当
小小科
2018/05/02
1.2K0
用Python机器学习搞定验证码
python图形验证码模块tesserocr
ocr图片识别通常可以利用tesserocr模块,将图片中内容识别出来并转换为text并输出
菲宇
2019/07/02
1.6K0
python图形验证码模块tesserocr
【python 图像识别】图像识别从菜鸟
一、安装配置(python2.7) 1.pip install pytesseract 2、pip install pyocr 3、pip install pillow 4、安装tesseract-ocr:http://jaist.dl.sourceforge.net/project/tesseract-ocr-alt/tesseract-ocr-setup-3.02.02.exe,安装在C:\Program Files\下 5、找到 pytesseract.py 更改 tesseract_cmd = 'C
py3study
2020/01/10
10.3K0
【python 图像识别】图像识别从菜鸟
python识别验证码系列1
(1)图像验证码:这是最简单的一种,也很常见。就比如CSDN登录几次失败之后就会出验证码。
周小董
2019/03/25
1.6K0
python识别验证码系列1
Python验证码识别
最近在做爬虫的时候发现手动输入验证码算是比较烦了,就网上搜了一下,结果发现真的有现成的,作者:老板丶鱼丸粗面,写的很完整,看一下。所有源码点击阅读原文。
我被狗咬了
2019/09/23
2.9K0
Python验证码识别
Python爬虫之图形验证码的识别
目前,许多网站采取各种各样的措施来反爬虫,其中一个措施便是使用验证码。随着技术的发展,验证码的花样越来越多。验证码最初是几个数字组合的简单的图形验证码,后来加入了英文字母和混淆曲线。有的网站还可能看到中文字符的验证码,这使得识别愈发困难。
仲君Johnny
2024/02/20
6490
Python爬虫之图形验证码的识别
神器!使用Python 轻松识别验证码
在我们进行自动化测试的过程中,免不了要在登录时遇到验证码,很多时候我们都是只能找开发要万能验证码或者暂时关闭验证码这个功能,但是有时候我们必须要验证码是否能够正常生成,所以在这个时候,我们需要做的就是输入验证码,但是验证码这个东西是随机生成的,不是每一次都一样,所以我们还是需要识别然后输入,脚本是没有眼睛的,只能通过代码来进行识别,所以本文就来给大家介绍一下如何使用Python来轻松识别数字验证码。
霍格沃兹测试开发Muller老师
2024/05/12
5400
Python图片验证码降噪 — 8邻域降噪
图片验证码识别的可以分为几个步骤,一般用 Pillow 库或 OpenCV 来实现,这几个过程是:
jhao104
2019/12/05
2.2K0
Python_识别弱图片验证码
图片验证码采用加干扰线、字符粘连、字符扭曲方式来增强识别难度,对于以上类型的验证码均不支持。 支持的弱验证码如下:
Java架构师必看
2021/03/22
8090
Python_识别弱图片验证码
Python 实现识别弱图片验证码
目前,很多网站为了防止爬虫肆意模拟浏览器登录,采用增加验证码的方式来拦截爬虫。验证码的形式有多种,最常见的就是图片验证码。其他验证码的形式有音频验证码,滑动验证码等。图片验证码越来越高级,识别难度也大幅提高,就算人为输入也经常会输错。本文主要讲解识别弱图片验证码。
猴哥yuri
2018/08/16
4.2K0
图形验证码的识别
先将原图转为灰度图像,然后再制定二值化阀值。变量 threshold 代表二值化阈值,阈值设置为 80。
hankleo
2020/09/17
2.9K0
Python实战图片验证码降噪处理
图片验证码算是网络数据采集上的一道拦路虎,虽然有诸多公开的ORC接口、云打码平台,一旦大规模应用起来,还是内部写程序进行识别处理比较好。
州的先生
2019/11/06
3.2K0
用Python识别图形验证码,实现自动登陆!
验证码有图形验证码、极验滑动验证码、点触验证码、宫格验证码。这回重点讲讲图形验证码的识别。
小F
2020/10/09
2.3K0
用Python识别图形验证码,实现自动登陆!
Python 爬虫简单验证码识别和抓包
OCR 即Optical Character Recognition, 光学字符识别,是指通过扫描字符,然后通过其形状将其翻译成电子文本的过程。 tesserocr 是Python的一个OCR识别库。GitHub:https://github.com/tesseract-ocr/tesseract 1 软件安装: 注意:在安装tesserocr前都需要先安装tesseract,具体说明如下: pip install tesserocr #安装tesserocr pip install pillow #
Python知识大全
2020/02/13
1.4K0
Python 爬虫简单验证码识别和抓包
爬虫还担心验证码问题吗?这你给你解决方案!
这里使用了 pytesseract 来进行验证码识别,它是基于 Google 的 Tesseract-OCR ,所以在使用之前需要先安装 Tesseract-OCR。使用 PIL 来进行图像处理。pytesseract 默认支持 tiff、bmp 图片格式,使用 PIL 库之后,能够支持 jpeg、gif、png 等其他图片格式;
1480
2019/08/05
1.2K0
爬虫还担心验证码问题吗?这你给你解决方案!
验证码
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
云雀叫了一整天
2019/09/29
2.7K0
验证码
knn算法,识别简单验证码图片
声明:本文均在pycharm上进行编辑操作,并本文所写代码均是python3进行编写,如果不能正常运行本文内的代码,请自己调试环境
十四君
2019/11/27
6710
knn算法,识别简单验证码图片
相关推荐
验证码的识别
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验