第二十三节:scrapy爬虫识别验证码(二)图片验证码识别

时间:2021-04-03 16:30:03

图片验证码基本上是有数字和字母或者数字或者字母组成的字符串,然后通过一些干扰线的绘制而形成图片验证码。

例如:知网的注册就有图片验证码

第二十三节:scrapy爬虫识别验证码(二)图片验证码识别

首先我们需要获取验证码图片,通过开发者工具我们可以得到验证码url链接

第二十三节:scrapy爬虫识别验证码(二)图片验证码识别

其次就是通过Pillow类库和tesserocr进行识别,代码如下:

 # -*- coding:utf-8 -*-
import tesserocr
from PIL import Image
import requests # 通过url链接获取验证码图片,并写入本地文件夹里
def get_image(path,url):
"""
:param path: 文件夹路径
:param url: 验证码url链接
"""
respon = requests.get(url=url) # 请求验证码url
with open(path,"wb") as file:
file.write(respon.content) # 将验证码写到本地 # 由于验证码图片太小,需要对验证码图片放大处理,以便识别
def reset_image_size(image_path):
"""
:param image_path: 图片所在的路径
:return:
"""
image = Image.open(fp=image_path) # 打开图片
pic_resize = 5 # 设置图片放大或者缩小倍数
(x, y) = image.size # 获取图片的大小
x_s = int(x * pic_resize) # 放大5倍(可调)
y_s = int(y * pic_resize) # 放大5倍(可调)
out = image.resize((x_s, y_s), Image.ANTIALIAS) # ANTIALIAS表示高质量图片
out.save(image_path) # 读取验证码图片文本
def read_image(image_path):
"""
:param image_path: 验证码图片路径
:return:
"""
image = Image.open(fp=image_path) # 打开验证码图片
image = image.convert('L') # 将验证码图片转换为灰度图(L表示灰度图)
threshold = 127 # 设置灰度图二值化阈值
table = []
for i in range(256): # 像素为256
if i < threshold:
table.append(0)
else:
table.append(1)
image = image.point(table, '') # 二值化处理后的副本(1表示二值化)
image.show()
result = tesserocr.image_to_text(image) # 验证码图片转换为文本
return result # 验证码识别信息脏数据处理
def VerifInfo(result):
"""
:param result: 验证码图片通过初步识别后得到的脏数据
:return:
"""
verif_str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
verif_list = []
for i in result:
if i in verif_str:
verif_list.append(i)
return "".join(verif_list) if __name__ == '__main__':
img_path = "D:\photo\image" # 文件夹目录
img_path = img_path + "\VerificationCode.png" # 验证码图片所在的目录及名称
img_url = "http://my.cnki.net/elibregister/CheckCode.aspx" # 验证码url
get_image(img_path,img_url) # 获取验证码图片
reset_image_size(img_path) # 调整验证码图片大小
result = read_image(img_path) # 读取验证码图片内容
verif_info = VerifInfo(result) # 验证码内容数据处理
verif_len = len(verif_info) # 验证码识别长度
if verif_len == 4 and verif_info:
print(verif_info)
else:
pass

图片字母数字验证码识别

最后就是看看识别的效果吧。前者为原始验证码图片,后者是经过二值化处理的图片。

第二十三节:scrapy爬虫识别验证码(二)图片验证码识别第二十三节:scrapy爬虫识别验证码(二)图片验证码识别

输出的结果为:FZug

显然使用tesserocr识别还是有误差的,以后可以用深度学习的方式训练处一个模型,可以提高识别效率,后期会跟进实现的。