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

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

 

对于你的一些频繁请求

 

对方会阻碍你

 

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

 

验证码的主要功能

 

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

 

 

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

 

 

技术又能对付人们的想法

 

一来一去

 

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

 

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

 

常见的验证码有这么几种

 

 

图像验证

语音验证

短信验证

极验验证

点击验证

 

今天

 

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

 

 

那么

 

接下来就是

 

学习 python 的正确姿势

 

 

python爬虫20 | 小帅b教你如何使用python识别图片验证码 随笔 第1张

 

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

 

python爬虫20 | 小帅b教你如何使用python识别图片验证码 随笔 第2张

(此图来源网络)

 

可以发现

 

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

 

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

 

或者搞一些噪点

 

或者把这些字符扭曲一下

 

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

 

接下来我们思考一下

 

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

 

python爬虫20 | 小帅b教你如何使用python识别图片验证码 随笔 第3张

 

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

 

什么噪点乱七八糟的

 

我们尽量把它们去掉

 

让图片

 

尽量黑白

 

尽量只剩下字符本身

 

然后再用 python 强大的 OCR 工具

 

Python-tesseract

 

 来识别我们优化好的图片

 

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

 

 

哎呀

 

我真是个聪明 boy 啊

 

python爬虫20 | 小帅b教你如何使用python识别图片验证码 随笔 第4张

 

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

 

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

 

 

第一张

 

python爬虫20 | 小帅b教你如何使用python识别图片验证码 随笔 第5张

 

难度系数: python爬虫20 | 小帅b教你如何使用python识别图片验证码 随笔 第6张

 

 

第二张

 

python爬虫20 | 小帅b教你如何使用python识别图片验证码 随笔 第7张

 

难度系数: python爬虫20 | 小帅b教你如何使用python识别图片验证码 随笔 第8张

 

 

第三张

 

python爬虫20 | 小帅b教你如何使用python识别图片验证码 随笔 第9张

 

难度系数: python爬虫20 | 小帅b教你如何使用python识别图片验证码 随笔 第10张

 

 

第四张

 

python爬虫20 | 小帅b教你如何使用python识别图片验证码 随笔 第11张

 

难度系数: python爬虫20 | 小帅b教你如何使用python识别图片验证码 随笔 第12张

 

 

第五张

 

python爬虫20 | 小帅b教你如何使用python识别图片验证码 随笔 第13张

 

难度系数 : python爬虫20 | 小帅b教你如何使用python识别图片验证码 随笔 第14张

 

 

先对第一张进行识别

 

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

 

所以相对简单

 

先安装一下  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)

 

打印结果

 

python爬虫20 | 小帅b教你如何使用python识别图片验证码 随笔 第15张

 

ok,么有问题

 

python爬虫20 | 小帅b教你如何使用python识别图片验证码 随笔 第16张

 

接着我们来识别第 2 张

 

python爬虫20 | 小帅b教你如何使用python识别图片验证码 随笔 第17张

 

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

 

结果打印出来是

 

python爬虫20 | 小帅b教你如何使用python识别图片验证码 随笔 第18张

 

1924??

python爬虫20 | 小帅b教你如何使用python识别图片验证码 随笔 第19张

 

这就说明

 

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

 

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

 

python爬虫20 | 小帅b教你如何使用python识别图片验证码 随笔 第20张

 

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

 

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

 

 

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

 

图片就变成灰了

 

python爬虫20 | 小帅b教你如何使用python识别图片验证码 随笔 第21张

 

虽然灰了

 

但是还不够

 

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

 

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)

 

这时候图片就变成这样了

 

python爬虫20 | 小帅b教你如何使用python识别图片验证码 随笔 第22张

 

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

 

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

 

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

 

成功识别

 

python爬虫20 | 小帅b教你如何使用python识别图片验证码 随笔 第23张

 

 

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

 

python爬虫20 | 小帅b教你如何使用python识别图片验证码 随笔 第24张

 

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

 

所以还是老办法

 

先处理灰度

 

再 二值化

 

这次我们再降一下噪

 

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)

 

图片变成这样了

 

python爬虫20 | 小帅b教你如何使用python识别图片验证码 随笔 第25张

 

再识别一下

 

python爬虫20 | 小帅b教你如何使用python识别图片验证码 随笔 第26张

 

 

 

python爬虫20 | 小帅b教你如何使用python识别图片验证码 随笔 第27张

 

不过

 

pytesseract 不是万能的

 

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

 

至于这张

 

python爬虫20 | 小帅b教你如何使用python识别图片验证码 随笔 第28张

 

你能看出它是 1l1l0oO0 么?

 

如果你能

 

算你牛逼

 

python爬虫20 | 小帅b教你如何使用python识别图片验证码 随笔 第29张

 

反正小帅b不能

 

所以 pytesseract 也不能

 

对于一些简单的验证码

 

使用 pytesseract 还是可以的

 

如果你想提高 pytesseract 识别率

 

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

 

python爬虫20 | 小帅b教你如何使用python识别图片验证码 随笔 第30张

 

ok

 

以上

 

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

 

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

 

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

 

应该不在话下了

 

 

下回见

 

听说你要 我啊!?

 

peace

 

python爬虫20 | 小帅b教你如何使用python识别图片验证码 随笔 第31张

 

 

      点个在看啊~~(破音)

python爬虫20 | 小帅b教你如何使用python识别图片验证码 随笔 第32张

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄