爬虫:验证码识别准确率(Tesseract-OCR)
?爬蟲:驗(yàn)證碼識(shí)別準(zhǔn)確率(Tesseract-OCR)
現(xiàn)在的網(wǎng)站為了防止人們輕易的獲取登陸后的頁面信息,在登陸上設(shè)置了很多的障礙,驗(yàn)證碼就是其中的一種,所謂道高一尺,魔高一丈,人們總能想出辦法來予以應(yīng)對(duì),但是,應(yīng)對(duì)的成本可能在不斷加大,這在一定程度上提升了反反爬蟲的門檻。本文的目的在于驗(yàn)證Tesseract對(duì)普通驗(yàn)證碼圖片的識(shí)別準(zhǔn)確率,以便為后續(xù)的工作做準(zhǔn)備。
Tesseract是一個(gè)開源的 OCR 引擎,可以識(shí)別多種格式的圖像文件并將其轉(zhuǎn)換成文本,由HP公司開發(fā),后來由Google進(jìn)行維護(hù)。下載地址:https://digi.bib.uni-mannheim.de/tesseract/
有關(guān)的安裝教程和使用方法,大家可以直接去百度,很多博主對(duì)此介紹的非常詳細(xì),這篇博文的主要目的是利用該OCR來分析它對(duì)驗(yàn)證碼識(shí)別的準(zhǔn)確率。所以,對(duì)于安裝及有關(guān)環(huán)境的配置就不再多講了。
- ? ?思路:
- (1)獲取批量驗(yàn)證碼圖片(利用某高校登錄頁面的驗(yàn)證碼圖片) ;
- (2)為驗(yàn)證碼圖片做信息標(biāo)注(雖然很不想手動(dòng)標(biāo)記,但這是必須的,因?yàn)槲覀円_保百分百正確);
- (3)利用Tesseract-OCR對(duì)驗(yàn)證碼圖片進(jìn)行識(shí)別并測(cè)試識(shí)別效果;
- (4)后續(xù)工作思路,如何提高識(shí)別的精度。
?一、爬取某高校頁面的驗(yàn)證碼圖片100張
?
打開該網(wǎng)址,就可以看到該驗(yàn)證碼圖片,并且沒刷新一次就會(huì)產(chǎn)生新的圖片;
使用代理不斷訪問該網(wǎng)址獲取驗(yàn)證碼圖片,并保存為png格式文件;
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, './verify_pictures/' + 'verify_' + str(i) + '.png')print('第' + str(i) + '張圖片下載成功')except Exception:print('第' + str(i) + '張圖片下載失敗')def get_proxy():# 使用代理步驟# - 1、設(shè)置代理地址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、創(chuàng)建ProxyHandlerproxy = random.choice(proxys)proxy_handler = request.ProxyHandler(proxy)# - 3、創(chuàng)建Openeropener = request.build_opener(proxy_handler)# - 4、導(dǎo)入Openerrequest.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)?保存之后的圖片;
二、對(duì)驗(yàn)證碼圖片手動(dòng)信息標(biāo)注,將圖片上的驗(yàn)證信息放入圖片的名稱內(nèi),便于后續(xù)測(cè)試
這個(gè)過程比較無聊,標(biāo)注完成之后的圖片是這樣的(無論數(shù)據(jù)分析還是圖像處理,信息標(biāo)注很多時(shí)候?qū)τ诔绦騿T來說都是一個(gè)體力活,眼力活);
?三、利用Tesseract-OCR進(jìn)行圖像信息識(shí)別,并將圖像的識(shí)別結(jié)果與藏在圖片文件名中的標(biāo)簽進(jìn)行比對(duì),測(cè)試識(shí)別的準(zhǔn)確率
這里涉及到圖像識(shí)別和數(shù)據(jù)處理,利用pytesseract庫來利用tesseract接口來進(jìn)行識(shí)別,并比較結(jié)果,輸出準(zhǔn)確率;
import pytesseract import cv2 import os import numpy as np path = 'F:/文件存放處/picture2/'file_name = [] for k in os.walk(path):file_name = k[-1]print('識(shí)別值' + '-----' + '真實(shí)值') num = 0 for i in file_name:img = cv2.imdecode(np.fromfile(path + i, dtype=np.uint8), 1)a = pytesseract.image_to_string(img)true_value = i[-8:-4]print(a + '-----' + true_value)if a == true_value:num += 1print('識(shí)別的準(zhǔn)確率為:' + str(num/100))?查看結(jié)果;
四、分析結(jié)果
改進(jìn)結(jié)果不涉及對(duì)識(shí)別方法的改進(jìn),只涉及對(duì)數(shù)據(jù)和識(shí)別結(jié)果的改進(jìn)。?
(1)觀察數(shù)據(jù)就可以看出,驗(yàn)證中的信息是由字母和數(shù)字組成,不存在特殊字符,由于圖片中含有部分噪音,導(dǎo)致識(shí)別出現(xiàn)較大誤差,如果去除識(shí)別結(jié)果中的特殊字符,只保留數(shù)字和字母,識(shí)別的效果會(huì)在一定程度上改進(jìn)。?
(2)真實(shí)數(shù)據(jù)都是只占四個(gè)位置,所以,可以在第一條的基礎(chǔ)上,對(duì)字符的數(shù)量進(jìn)行限制,設(shè)置為小于等于4
(3)真實(shí)數(shù)據(jù)中不存在大寫字母,將識(shí)別結(jié)果一律轉(zhuǎn)換為小寫
(1)通過觀察可以看到圖片上有很多噪音,利用OpenCV對(duì)圖片進(jìn)行降噪處理
后續(xù)處理:下一篇博文:https://blog.csdn.net/qq_40962368/article/details/89331608
總結(jié)
以上是生活随笔為你收集整理的爬虫:验证码识别准确率(Tesseract-OCR)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++数组指针不能自增1/自减1
- 下一篇: python assert函数