網路爬蟲以及自動化測試中圖形驗證碼識別解決思路以及方法
阿新 • • 發佈:2018-11-10
前言
做自動化測試的朋友都知道圖形驗證碼在整個自動化執行過程中,很可能是阻礙推進的問題,可以採用萬能驗證碼(開發哥哥會流出一個供自動化測試用的),如果不通過開發預留,有以下解決方案。
解決思路
1.python3自帶光學字元識別模組tesserocr與pytesseract,可以識別簡單驗證碼;
2.稍複雜不容易識別的驗證碼,有大神給出解決方案是:完美驗證碼識別系統V3.2.1.zip,使用過程中需要製作自己驗證碼的識別庫,簡單可靠;
3.python神經網路訓練識別驗證碼。
實現程式碼
1.python自帶pytesseract庫識別簡單驗證碼:
#!/usr/bin/env python import pytesseract class ShiBie(): # 圖形驗證碼xpath tuxing_loc = ( "xpath", "/html/body/div[1]/div[1]/div/div/div[2]/div/form/div/div[2]/dl/dd[1]/div[5]/a/img") # 獲取提前定義好的驗證碼儲存路徑 shot = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + ("\\screenshot\\hf_im\\screenshot.png") def huoqutuxing(self): element = self.findElement(self.tuxing_loc) left = element.location['x'] top = element.location['y'] right = element.location['x'] + element.size['width'] bottom = element.location['y'] + element.size['height'] im = Image.open(self.shot) im = im.crop((left, top, right, bottom)) img = im.convert('L') # 轉換模式:L | RGB img = ImageEnhance.Contrast(img) # 增強對比度 img = img.enhance(2.0) # 增加飽和度 img.save(self.shot) code = pytesseract.image_to_string(img) img.close() print(code) return code.replace(' ', '') # 由於識別過程不一定準確,需要增加後續程式碼,確保輸入正確 def yzm_huoqu(self,driver): for i in range(5): if not self.is_alert(driver): s = self.huoqutuxing() self.input_tuxing(s) self.click_yzm_button() time.sleep(5) else: break
將以上程式碼封裝到你自己的方法中,可以識別容易是別的驗證碼。
2.完美驗證碼識別系統:
具體參考大神csdn:https://download.csdn.net/download/crazyidea88/10178098
# coding=gbk
import urllib
import time
import string
import ctypes
from ctypes import *
# 載入dll檔案
dll = ctypes.windll.LoadLibrary('WmCode.dll')
if(dll.UseUnicodeString(1,1)): #傳入的文字格式
print('SetInUnicode Success:')#UseUnicodeString呼叫一次即可,無需重複呼叫,重複呼叫會出現系統級IO錯誤。
else:
print('etInUnicode Fail!')
if(dll.LoadWmFromFile('C:\Users\Administrator\Desktop\1\shibie.dat','xxx')):#使用絕對路徑 print('Loaddat Success:')#LoadWmFromFile呼叫一次即可,無需重複呼叫 Str = create_string_buffer(20)#建立文字緩衝區 if(dll.GetImageFromFile(C:\Users\Administrator\Desktop\1\wylt.JPG',Str)):#使用絕對路徑 print('GetVcode Success:',Str.raw.decode("gbk")) else: print('GetVcode Fail!') else: print('Loaddat Fail!')
3.python神經網路訓練識別驗證碼
關於神經網路訓練練識別驗證碼網上資料很多,這裡不做整理
總結
具體用那種方法因人而已,看驗證碼複雜程度選擇,我們只是程式碼的搬運工,由點到面,面到體,在巨人的肩上了解更多的技術發展。