当你在爬取某些网站的时候

对于你的一些频繁请求

对方会阻碍你

常见的方式就是使用验证码

验证码的主要功能

就是区分你是人还是鬼(机器人)

想法设法的搞一些手段来对付技术

技术又能对付人们的想法

一来一去

就有了各种各样的变态验证码

也有了各种各样的应对方式

常见的验证码有这么几种

图像验证

语音验证

短信验证

极验验证

点击验证

今天

小帅b想跟你先说说如何识别图像验证码

那么

接下来就是

学习 python 的正确姿势

我们来看看这些图片验证码

(此图来源网络)

可以发现

这些验证码大多是数字和字母组成

然后在此之上再添加一些像毛一样的线

或者搞一些噪点

或者把这些字符扭曲一下

为了增加识别难度也是辛苦人家了

接下来我们思考一下

我们要识别这类验证码要怎么做呢

首先要处理一下验证码图片

什么噪点乱七八糟的

我们尽量把它们去掉

让图片

尽量黑白

尽量只剩下字符本身

然后再用 python 强大的 OCR 工具

Python-tesseract

来识别我们优化好的图片

这样正确率就会大大的提高

哎呀

我真是个聪明 boy 啊

为了让你更清楚的知道怎么识别图像验证码

小帅b用 python 搞了几张识别难度不同的验证码

第一张

难度系数: 

第二张

难度系数: 

第三张

难度系数: 

第四张

难度系数: 

第五张

难度系数 : 

先对第一张进行识别

这张看起来没什么 "污染"

所以相对简单

先安装一下  pytesseract

pip install pytesseract

接着安装一下  tesseract-ocr

如果你是 ubuntu 系统可以直接使用如下命令安装

sudo apt install tesseract-ocr

如果你是 win 系统自行 Google 一下安装  tesseract-ocr 以及环境变量配置

完了之后就导入相关模块到我们的代码文件中

try:    from PIL import Imageexcept ImportError:    import Imageimport pytesseract

接着我们就打开第一张图片

使用 pytesseract 识别

打印一下

captcha = Image.open("captcha1.png")result = pytesseract.image_to_string(captcha)print(result)

打印结果

ok,么有问题

接着我们来识别第 2 张

captcha = Image.open("claptcha2.png")result = pytesseract.image_to_string(captcha)print(result)

结果打印出来是

1924??

这就说明

pytesseract 是没办法识别太多噪点的图片的

如果这个图片再加上一点彩色背景

那么对 pytesseract 来说更是有点吃力的

所以我们先对这张图片灰度处理一下

captcha = Image.open("captcha2.png")result = captcha.convert('L')result.show()

图片就变成灰了

虽然灰了

但是还不够

我们除了处理灰度还需要对其 二值化

def convert_img(img,threshold):    img = img.convert("L")  # 处理灰度    pixels = img.load()    for x in range(img.width):        for y in range(img.height):            if pixels[x, y] > threshold:                pixels[x, y] = 255            else:                pixels[x, y] = 0    return img

调用一下

convert_img(captcha,150)

这时候图片就变成这样了

是不是一下子就清晰很多了呢

这时候我们对这张图片识别一下

# 识别一下result = pytesseract.image_to_string(result)print(result)

成功识别

接下来我们再来看看有毛有噪的图片

这时候直接去识别是识别不出来的

所以还是老办法

先处理灰度

再 二值化

这次我们再降一下噪

data = img.getdata()    w,h = img.size    count = 0    for x in range(1,h-1):        for y in range(1, h - 1):            # 找出各个像素方向            mid_pixel = data[w * y + x]            if mid_pixel == 0:                top_pixel = data[w * (y - 1) + x]                left_pixel = data[w * y + (x - 1)]                down_pixel = data[w * (y + 1) + x]                right_pixel = data[w * y + (x + 1)]
if top_pixel == 0: count += 1 if left_pixel == 0: count += 1 if down_pixel == 0: count += 1 if right_pixel == 0: count += 1 if count > 4: img.putpixel((x, y), 0)

图片变成这样了

再识别一下

不过

pytesseract 不是万能的

对于稍微复杂一点的就识别不出来了

至于这张

你能看出它是 1l1l0oO0 么?

如果你能

算你牛逼

反正小帅b不能

所以 pytesseract 也不能

对于一些简单的验证码

使用 pytesseract 还是可以的

如果你想提高 pytesseract 识别率

还可以去搞些图片去训练一下 tesseract-ocr

ok

以上

主要让你了解一下图片识别库的使用

以及对一些图片的常用降噪操作

那么下次你爬到一些需要图像的简单验证码

应该不在话下了

下回见

听说你要 我啊!?

peace

点个在看啊~~(破音)

python爬虫20 | 小帅b教你如何使用python识别图片验证码的更多相关文章

  1. Python爬虫常用小技巧之设置代理IP

    设置代理IP的原因 我们在使用Python爬虫爬取一个网站时,通常会频繁访问该网站.假如一个网站它会检测某一段时间某个IP的访问次数,如果访问次数过多,它会禁止你的访问.所以你可以设置一些代理服务器来 ...

  2. python爬虫14 | 就这么说吧,如果你不懂python多线程和线程池,那就去河边摸鱼!

    你知道吗? 在我的心里 你是多么的重要 就像 恩 请允许我来一段 freestyle 你们准备好了妹油 你看 这个碗 它又大又圆 就像 这条面 它又长又宽 你们 在这里 看文章 觉得 很开心 就像 我 ...

  3. 【数量技术宅 | Python爬虫系列分享】实时监控股市重大公告的Python爬虫

    实时监控股市重大公告的Python爬虫小技巧 精力有限的我们,如何更加有效率地监控信息? 很多时候特别是交易时,我们需要想办法监控一些信息,比如股市的公告.如果现有的软件没有办法实现我们的需求,那么就 ...

  4. Python爬虫(小练习)

    近日,在浏览伯乐在线(http://blog.jobbole.com/29281/)的时候碰到一些很不错的资源:25本免费的Python电子书 如下图: 其中,每本都是以名字+超链接的方式,于是激起了 ...

  5. python爬虫下载小视频和小说(基础)

    下载视频: 1 from bs4 import BeautifulSoup 2 import requests 3 import re 4 import urllib 5 6 7 def callba ...

  6. Python爬虫实战小项目

    爬取国家药品监督管理总局中基于中华人民共和国化妆品生产许可证相关数据 import requests from fake_useragent import UserAgent ua = UserAge ...

  7. Python爬虫要学什么?写给小白的Python爬虫必备技能

    Python在爬虫方面用得比较多,所以你如果能掌握以下内容,找工作的时候就会顺利很多: 1.爬虫,不是抓取到数据就完事了,如果有数据抽取.清洗.消重等方面经验,也是加分项; 2.大部分的公司都要求爬虫 ...

  8. 【转】Python OCR识别图片验证码

    转载自:博客 对于某些网站登录的时候,往往需要输入验证码才能实现登录.如果要爬虫这类网站,往往总会比这个验证码导致无法爬取数据.以下介绍一种比较折中的方法,也是比较可行的方法: 实现思想: 1.通过截 ...

  9. python下以api形式调用tesseract识别图片验证码

    一.背景 之前在博文中介绍在python中如何调用tesseract ocr引擎,当时主要介绍了shell模式,shell模式需要安装tesseract程序,并且效率相对略低. 今天介绍api形式的调 ...

随机推荐

  1. HDU5441 Travel 离线并查集

    Travel Problem Description Jack likes to travel around the world, but he doesn’t like to wait. Now, ...

  2. Codeforces Round #211 (Div. 2)B. Fence

    B. Fence time limit per test 1 second memory limit per test 256 megabytes input standard input outpu ...

  3. 异常java.lang.UnsupportedOperationException: The application must supply JDBC connections

    转自:https://blog.csdn.net/q952420873/article/details/81355586 先上图  根据这个错误溯源 于是 我来到了数据库连接部分的代码 ,发现多了一个 ...

  4. php phppowerpoint

    今天早上从订阅的 Zend DevZone 看到篇很有意思的文章. Creating PowerPoint 2007 files using PHP. 试了一下. 果然很又意思, 分享给大家吧. 程序 ...

  5. python自动化测试学习笔记-6urllib模块&request模块

    python3的urllib 模块提供了获取页面的功能. urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capat ...

  6. Codeforces 766E

    题意:给一棵树(1e5),每个节点上有对应权值(0<=ai<=1e6)定义树上两个节点间的距离为路径中节点的异或,求所有节点对间的距离和(包括节点自身也作为节点对,距离为节点权值). 解题 ...

  7. DataFrame编程模型初谈与Spark SQL

    Spark SQL在Spark内核基础上提供了对结构化数据的处理,在Spark1.3版本中,Spark SQL不仅可以作为分布式的SQL查询引擎,还引入了新的DataFrame编程模型. 在Spark ...

  8. Java系列学习(十四)-集合

    1.java中的集合学习 2.Collection中常用方法 1.添加功能 boolean add(E e):添加一个元素 boolean addAll(Collection<? extends ...

  9. Android RecyclerView使用 及 滑动时加载图片优化方案

    1.控制线程数量 + 数据分页加载2.重写onScrollStateChanged方法 这个我们后面再谈,下面先来看看RecyclerView控件的使用及我们为什么选择使用它 RecyclerView ...

  10. Hive扩展功能(四)--HiveServer2服务

    软件环境: linux系统: CentOS6.7 Hadoop版本: 2.6.5 zookeeper版本: 3.4.8 主机配置: 一共m1, m2, m3这五部机, 每部主机的用户名都为centos ...