根据这篇博客实现:https://blog.csdn.net/qq_40962368/article/details/89331608
代码地址:https://github.com/Chakid/ImageProcess
现在的网站为了防止人们轻易的获取登陆后的页面信息,在登陆上设置了很多的障碍,验证码就是其中的一种,所谓道高一尺,魔高一丈,人们总能想出办法来予以应对,但是,应对的成本可能在不断加大,这在一定程度上提升了反反爬虫的门槛。本文的目的在于验证Tesseract对普通验证码图片的识别准确率,以便为后续的工作做准备。
思路:
(1)获取批量验证码图片(利用某高校登录页面的验证码图片) ;
(2)为验证码图片做信息标注(虽然很不想手动标记,但这是必须的,因为我们要确保百分百正确);
(3)利用Tesseract-OCR对验证码图片进行识别并测试识别效果;
(4)后续工作思路,如何提高识别的精度。
爬取某高校页面的验证码:
对验证码图片手动信息标注,将图片上的验证信息放入图片的名称内,便于后续测试
运行识别验证码识别代码:
爬取代码:
使用代理不断访问该网址获取验证码图片,并保存为png格式文件;
# coding:utf-8
#爬取验证码
from urllib import request
import time
import random
def get_and_save_verify(i):
try:
url = 'http://jwxt.qlu.edu.cn/verifycode.servlet'
request.urlretrieve(url, 'img/hb/' + 'verify_' + str(i) + '.png')
print('第' + str(i) + '张图片下载成功')
except Exception:
print('第' + str(i) + '张图片下载失败')
def get_proxy():
# 使用代理步骤
# - 1、设置代理地址
proxys = [{'http': '39.137.69.10:8080'},
{'http': '111.206.6.101:80'},
{'http': '120.210.219.101:8080'},
{'http': '111.206.6.101:80'},
{'https': '120.237.156.43:8088'}]
# - 2、创建ProxyHandler
proxy = random.choice(proxys)
proxy_handler = request.ProxyHandler(proxy)
# - 3、创建Opener
opener = request.build_opener(proxy_handler)
# - 4、导入Opener
request.install_opener(opener)
if __name__ == '__main__':
for i in range(1, 101):
get_proxy()
time.sleep(random.randint(1, 4))
get_and_save_verify(i)
验证码识别代码:
利用Tesseract-OCR进行图像信息识别,并将图像的识别结果与藏在图片文件名中的标签进行比对,测试识别的准确率。
降噪处理:
分别用高斯滤波、中值滤波和双边滤波对图像进行降噪处理,并不断调整参数,确定出对应方法的最优参数
# 对结果的处理
st = re.sub(r'[^A-Za-z0-9]+', '', a)
st = st.lower()
if len(st) > 4:
b = st[-4:]
else:
b = st
整个识别代码
# coding:utf-8
#识别验证码
import pytesseract
import cv2
import os
import numpy as np
import re
path = 'img/hb/'
file_name = []
for k in os.walk(path):
file_name = k[-1]
print('识别值' + '-----' + '真实值')
num = 0
for i in file_name:
img = cv2.imdecode(np.fromfile(path + i, dtype=np.uint8), 1)
# 对数据的处理
# blur = cv2.GaussianBlur(img, (3, 3), 0) # 高斯滤波函数
# blur = cv2.medianBlur(img, 3) # 中值滤波函数
blur = cv2.bilateralFilter(img, 3, 560, 560) # 双边滤波函数 560:0.28
a = pytesseract.image_to_string(blur)
# 对结果的处理
st = re.sub(r'[^A-Za-z0-9]+', '', a)
st = st.lower()
if len(st) > 4:
b = st[-4:]
else:
b = st
true_value = i[-8:-4]
print(b + '-----' + true_value)
if b == true_value:
num += 1
print('识别的准确率为:' + str(num / 20))