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

对于你的一些频繁请求

对方会阻碍你

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

验证码的主要功能

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

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

技术又能对付人们的想法

一来一去

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

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

常见的验证码有这么几种

图像验证

语音验证

短信验证

极验验证

点击验证

今天

小帅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. 批量ssh执行命令

    [root@openfire1 script]# cat test.sh  #!/bin/bash   #本地通过ssh执行远程服务器的脚本   for ip in `cat iplist`  do ...

  2. 【C++程序不输出】到底是什么造成了程序不输出

    (ubuntu 16.04) 最近做题的时候,经常莫名其妙地,程序写的明明没毛病但是就是输出不了,气得我呀 然后某一次突然发现了原因,竟然是输出之后没有加endl或者空格! 例如: cout<& ...

  3. CF19 E Fairy——树上差分

    题目:http://codeforces.com/contest/19/problem/E 先把图连成一棵树,然后对于每条非树边,判断它是在奇环中还是偶环中: 把环上的点打上相应的差分标记,并记录有多 ...

  4. PCB Genesis 外形加内角孔实现方法

    在PCB工程制作CAM时,经常会遇到外形拐角处直角的,而客户对内角是要求,比如最大内角要求R0.5mm或者不接受内角, 但成型方式为铣方式,又不是啤板成型,那怎么处理才可以达到要求效果呢,在这里介绍2 ...

  5. [Swift通天遁地]三、手势与图表-(11)制作雷达图表更加形象表示各个维度的情况

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  6. ACM_3n+1问题(克拉兹问题+线段树区间查询最大值)

    3n+1问题 Time Limit: 2000/1000ms (Java/Others) Problem Description: 考虑如下的序列生成算法:从整数n开始,如果n是偶数,把它除以2:如果 ...

  7. Java——Spring配置

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  8. asp.net——根据时间,显示内容

    题目: 在VS 2010中建立一个网站,命名为Lab5_1,建立时注意项目文件夹的存放位置.根据当前时间,在页面上显示早上好或下午好或晚上好,并显示相应的不同图片. 体验: 一开始看到这个题目的时候, ...

  9. (转)50道JavaScript基础面试题(附答案)

    https://segmentfault.com/a/1190000015288700 1 介绍JavaScript的基本数据类型 Number.String .Boolean .Null.Undef ...

  10. drupal 8 ——自定义权限

    在项目开发里面,我遇到了这么一个需求,就是对于node的title字段,编辑内容的角色不允许对title进行编辑.title字段是创建内容类型时自动生成的字段,不能在drupal8后台直接配置权限,所 ...