1. 程式人生 > >網路爬蟲以及自動化測試中圖形驗證碼識別解決思路以及方法

網路爬蟲以及自動化測試中圖形驗證碼識別解決思路以及方法

前言

做自動化測試的朋友都知道圖形驗證碼在整個自動化執行過程中,很可能是阻礙推進的問題,可以採用萬能驗證碼(開發哥哥會流出一個供自動化測試用的),如果不通過開發預留,有以下解決方案。

解決思路

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神經網路訓練識別驗證碼

關於神經網路訓練練識別驗證碼網上資料很多,這裡不做整理

總結

具體用那種方法因人而已,看驗證碼複雜程度選擇,我們只是程式碼的搬運工,由點到面,面到體,在巨人的肩上了解更多的技術發展。