爬虫:验证码识别准确率(Tesseract-OCR)
?爬蟲:驗證碼識別準確率(Tesseract-OCR)
現在的網站為了防止人們輕易的獲取登陸后的頁面信息,在登陸上設置了很多的障礙,驗證碼就是其中的一種,所謂道高一尺,魔高一丈,人們總能想出辦法來予以應對,但是,應對的成本可能在不斷加大,這在一定程度上提升了反反爬蟲的門檻。本文的目的在于驗證Tesseract對普通驗證碼圖片的識別準確率,以便為后續的工作做準備。
Tesseract是一個開源的 OCR 引擎,可以識別多種格式的圖像文件并將其轉換成文本,由HP公司開發,后來由Google進行維護。下載地址:https://digi.bib.uni-mannheim.de/tesseract/
有關的安裝教程和使用方法,大家可以直接去百度,很多博主對此介紹的非常詳細,這篇博文的主要目的是利用該OCR來分析它對驗證碼識別的準確率。所以,對于安裝及有關環境的配置就不再多講了。
- ? ?思路:
- (1)獲取批量驗證碼圖片(利用某高校登錄頁面的驗證碼圖片) ;
- (2)為驗證碼圖片做信息標注(雖然很不想手動標記,但這是必須的,因為我們要確保百分百正確);
- (3)利用Tesseract-OCR對驗證碼圖片進行識別并測試識別效果;
- (4)后續工作思路,如何提高識別的精度。
?一、爬取某高校頁面的驗證碼圖片100張
?
打開該網址,就可以看到該驗證碼圖片,并且沒刷新一次就會產生新的圖片;
使用代理不斷訪問該網址獲取驗證碼圖片,并保存為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、設置代理地址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、創建ProxyHandlerproxy = random.choice(proxys)proxy_handler = request.ProxyHandler(proxy)# - 3、創建Openeropener = request.build_opener(proxy_handler)# - 4、導入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)?保存之后的圖片;
二、對驗證碼圖片手動信息標注,將圖片上的驗證信息放入圖片的名稱內,便于后續測試
這個過程比較無聊,標注完成之后的圖片是這樣的(無論數據分析還是圖像處理,信息標注很多時候對于程序員來說都是一個體力活,眼力活);
?三、利用Tesseract-OCR進行圖像信息識別,并將圖像的識別結果與藏在圖片文件名中的標簽進行比對,測試識別的準確率
這里涉及到圖像識別和數據處理,利用pytesseract庫來利用tesseract接口來進行識別,并比較結果,輸出準確率;
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('識別值' + '-----' + '真實值') 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('識別的準確率為:' + str(num/100))?查看結果;
四、分析結果
改進結果不涉及對識別方法的改進,只涉及對數據和識別結果的改進。?
(1)觀察數據就可以看出,驗證中的信息是由字母和數字組成,不存在特殊字符,由于圖片中含有部分噪音,導致識別出現較大誤差,如果去除識別結果中的特殊字符,只保留數字和字母,識別的效果會在一定程度上改進。?
(2)真實數據都是只占四個位置,所以,可以在第一條的基礎上,對字符的數量進行限制,設置為小于等于4
(3)真實數據中不存在大寫字母,將識別結果一律轉換為小寫
(1)通過觀察可以看到圖片上有很多噪音,利用OpenCV對圖片進行降噪處理
后續處理:下一篇博文:https://blog.csdn.net/qq_40962368/article/details/89331608
總結
以上是生活随笔為你收集整理的爬虫:验证码识别准确率(Tesseract-OCR)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++数组指针不能自增1/自减1
- 下一篇: MATLAB警告: 矩阵为奇异工作精度