6、爬取某高校页面的验证码,进行验证码识别

根据这篇博客实现: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))

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值