第二十二節:scrapy爬蟲識別驗證碼(一)字母數字組合驗證碼識別


圖片驗證碼基本上是有數字和字母或者數字或者字母組成的字符串,然后通過一些干擾線的繪制而形成圖片驗證碼。

例如:知網的注冊就有圖片驗證碼

 

首先我們需要獲取驗證碼圖片,通過開發者工具我們可以得到驗證碼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識別還是有誤差的,以后可以用深度學習的方式訓練處一個模型,可以提高識別效率,后期會跟進實現的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM