圖片驗證碼基本上是有數字和字母或者數字或者字母組成的字符串,然后通過一些干擾線的繪制而形成圖片驗證碼。
例如:知網的注冊就有圖片驗證碼
首先我們需要獲取驗證碼圖片,通過開發者工具我們可以得到驗證碼url鏈接
其次就是通過Pillow類庫和tesserocr進行識別,代碼如下:

1 # -*- coding:utf-8 -*- 2 import tesserocr 3 from PIL import Image 4 import requests 5 6 # 通過url鏈接獲取驗證碼圖片,並寫入本地文件夾里 7 def get_image(path,url): 8 """ 9 :param path: 文件夾路徑 10 :param url: 驗證碼url鏈接 11 """ 12 respon = requests.get(url=url) # 請求驗證碼url 13 with open(path,"wb") as file: 14 file.write(respon.content) # 將驗證碼寫到本地 15 16 17 # 由於驗證碼圖片太小,需要對驗證碼圖片放大處理,以便識別 18 def reset_image_size(image_path): 19 """ 20 :param image_path: 圖片所在的路徑 21 :return: 22 """ 23 image = Image.open(fp=image_path) # 打開圖片 24 pic_resize = 5 # 設置圖片放大或者縮小倍數 25 (x, y) = image.size # 獲取圖片的大小 26 x_s = int(x * pic_resize) # 放大5倍(可調) 27 y_s = int(y * pic_resize) # 放大5倍(可調) 28 out = image.resize((x_s, y_s), Image.ANTIALIAS) # ANTIALIAS表示高質量圖片 29 out.save(image_path) 30 31 32 # 讀取驗證碼圖片文本 33 def read_image(image_path): 34 """ 35 :param image_path: 驗證碼圖片路徑 36 :return: 37 """ 38 image = Image.open(fp=image_path) # 打開驗證碼圖片 39 image = image.convert('L') # 將驗證碼圖片轉換為灰度圖(L表示灰度圖) 40 threshold = 127 # 設置灰度圖二值化閾值 41 table = [] 42 for i in range(256): # 像素為256 43 if i < threshold: 44 table.append(0) 45 else: 46 table.append(1) 47 image = image.point(table, '1') # 二值化處理后的副本(1表示二值化) 48 image.show() 49 result = tesserocr.image_to_text(image) # 驗證碼圖片轉換為文本 50 return result 51 52 53 # 驗證碼識別信息臟數據處理 54 def VerifInfo(result): 55 """ 56 :param result: 驗證碼圖片通過初步識別后得到的臟數據 57 :return: 58 """ 59 verif_str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890" 60 verif_list = [] 61 for i in result: 62 if i in verif_str: 63 verif_list.append(i) 64 return "".join(verif_list) 65 66 67 68 if __name__ == '__main__': 69 img_path = "D:\photo\image" # 文件夾目錄 70 img_path = img_path + "\VerificationCode.png" # 驗證碼圖片所在的目錄及名稱 71 img_url = "http://my.cnki.net/elibregister/CheckCode.aspx" # 驗證碼url 72 get_image(img_path,img_url) # 獲取驗證碼圖片 73 reset_image_size(img_path) # 調整驗證碼圖片大小 74 result = read_image(img_path) # 讀取驗證碼圖片內容 75 verif_info = VerifInfo(result) # 驗證碼內容數據處理 76 verif_len = len(verif_info) # 驗證碼識別長度 77 if verif_len == 4 and verif_info: 78 print(verif_info) 79 else: 80 pass
最后就是看看識別的效果吧。前者為原始驗證碼圖片,后者是經過二值化處理的圖片。
輸出的結果為:FZug
顯然使用tesserocr識別還是有誤差的,以后可以用深度學習的方式訓練處一個模型,可以提高識別效率,后期會跟進實現的。