上一篇文章講到用selenium模擬登陸界面,然後人工輸入驗證碼,這樣增加了人的工作量,增加了處理時間,並且可能驗證碼輸入錯誤,下面我通過截取驗證碼部分,然後通過圖片識別方式獲取驗證碼信息。
首先是截取當前的登陸界面,然後定位到驗證碼的位置截取驗證碼圖片。我遇到的問題是相同的位置,有時候會遇到截取的圖片沒有驗證碼、者驗證碼模糊不清楚、驗證碼很小等問題。查找之後發現是截屏時,頁面沒有顯示完全導致的。
用time.sleep(2)來推遲頁面的截取時間。
import time
from selenium import webdriver
import os
from PIL import Image
import pytesseract
pytesseract.pytesseract.tesseract_cmd = 'mypath\\Tesseract-OCR\\tesseract.exe'
self.driver =webdriver.Chrome(CHROME_DRIVER) #初始化對象
self.driver.set_window_size(900, 900) #設置窗口大小
time.sleep(2)
self.driver.get_screenshot_as_file(os.path.join(BASE_DIR, 'veri.png'))#獲取當前窗口截屏並保存在程序文件根目錄
left = 700 #獲取驗證最左邊位置
top = 350 #獲取驗證碼上邊位置
right = left + 50 #獲取驗證碼右邊位置
bottom = top + 20 #獲取驗證碼下邊位置
open_img = Image.open('veri.png')#打開屏幕截圖
open_img = open_img.crop((left, top, right, bottom))#使用獲取到的位置剪切圖片
open_img.show()#顯示圖片
image = open_img.convert('L') # 將驗證碼圖片轉換爲灰度圖(L表示灰度圖)
threshold = 127 # 設置灰度圖二值化閾值
table = []
for i in range(256): # 像素爲256
if i < threshold:
table.append(0)
else:
table.append(1)
image = image.point(table, '1') # 二值化處理後的副本(1表示二值化)
result = pytesseract.image_to_string(image)# 驗證碼圖片轉換爲文本
# 驗證碼識別信息髒數據處理
verif_str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
verif_list = []
for i in result:
if i in verif_str:
verif_list.append(i)
veri = "".join(verif_list)
print(veri)