Python+Selenium 含驗證碼的登入處理
阿新 • • 發佈:2019-01-05
以易碼網站的註冊介面為例
python版本:2.7
所需要的程式碼庫:PIL,selenium,pytesser
selenium安裝
pip install selenium
程式碼庫安裝地址稍後給出,也可自行百度
先上完整程式碼
有需要請在下方留言,由於水平有限,部分程式碼並不嚴謹
from selenium import webdriver import time import sys,os from PIL import Image,ImageDraw import re import time from PIL import ImageGrab from pytesser import * reload(sys) sys.setdefaultencoding('utf-8') #getPixel為去噪演算法 def getPixel(image,x,y,G,N): L = image.getpixel((x,y)) if L > G: L = True else: L = False nearDots = 0 if L == (image.getpixel((x - 1,y - 1)) > G): nearDots += 1 if L == (image.getpixel((x - 1,y)) > G): nearDots += 1 if L == (image.getpixel((x - 1,y + 1)) > G): nearDots += 1 if L == (image.getpixel((x,y - 1)) > G): nearDots += 1 if L == (image.getpixel((x,y + 1)) > G): nearDots += 1 if L == (image.getpixel((x + 1,y - 1)) > G): nearDots += 1 if L == (image.getpixel((x + 1,y)) > G): nearDots += 1 if L == (image.getpixel((x + 1,y + 1)) > G): nearDots += 1 if nearDots < N: return image.getpixel((x,y-1)) else: return None # 降噪 # 根據一個點A的RGB值,與周圍的8個點的RBG值比較,設定一個值N(0 <N <8),當A的RGB值與周圍8個點的RGB相等數小於N時,此點為噪點 # G: Integer 影象二值化閥值 # N: Integer 降噪率 0 <N <8 # Z: Integer 降噪次數 # 輸出 # 0:降噪成功 # 1:降噪失敗 def clearNoise(image,G,N,Z): draw = ImageDraw.Draw(image) for i in xrange(0,Z): for x in xrange(1,image.size[0] - 1): for y in xrange(1,image.size[1] - 1): color = getPixel(image,x,y,G,N) if color != None: draw.point((x,y),color) #測試程式碼 def imagetext(): os.chdir("C:\Python27\Scripts") time.sleep(2) #截圖,獲取需要識別的區域 #座標根據自己的解析度自行調整 x = 1069 y = 557 m = 1144 n = 586 i=1 box = (x,y,m,n) img = ImageGrab.grab(box) #儲存擷取的驗證碼圖片 img.save("D:/home/lyt/yzm2/1.jpg") #截圖完畢後,開始影象識別 #判斷識別出的驗證碼是否為四位數,因為pytesser對有干擾的圖片識別率較低,故採用多次截圖並識別 im = Image.open("D:/home/lyt/yzm2/1.jpg") text = image_to_string(im) text = text.replace(' ','') text = re.findall(r"\d+\.?\d*",text) b = len(str(text)) while (b != 8): print i #b為驗證碼陣列長度,b=8說明識別成功,否則點選網頁驗證碼圖片重新整理驗證碼再次截圖並識別 button = browser.find_element_by_id('CaptchaImg') button.click() img = ImageGrab.grab(box) i = 2 #截圖儲存路徑 src = 'D:/home/lyt/yzm2/' + bytes(i) + '.jpg' #轉灰度並去噪後儲存路徑 src1 = 'D:/home/lyt/yzm3/' + bytes(i) + '.jpg' img.save(src) image = Image.open(src) #將圖片轉換成灰度圖片 image = image.convert("L") #去噪,G = 50,N = 1,Z = 1 #N,Z可根據自己需要更改,目前識別成功率在1/3左右 clearNoise(image,50,1,1) #儲存圖片 image.save(src1) #截圖處理完畢後,開始影象識別 im = Image.open(src1) text = image_to_string(im) text = text.replace(' ','') text = re.findall(r"\d+\.?\d*",text) b = len(str(text)) print text[0] return text[0] #以下為selenium對瀏覽器的操作 browser = webdriver.Firefox() browser.maximize_window() browser.get("http://www.51ym.me/user/Register.aspx") input_username = browser.find_element_by_id('username') input_username.send_keys("ghoulq12583") input_pwd = browser.find_element_by_id('password') input_pwd.send_keys("1234567890") input_rapwd = browser.find_element_by_id('rapwd') input_rapwd.send_keys("1234567890") input_qq = browser.find_element_by_id('qq') input_qq.send_keys("3287611848") #開始驗證碼識別 a = imagetext() input_verify = browser.find_element_by_id('verify') input_verify.send_keys(a) button = browser.find_element_by_id('SubmitBtn') button.click()