1. 程式人生 > >Python+Selenium 含驗證碼的登入處理

Python+Selenium 含驗證碼的登入處理

以易碼網站的註冊介面為例

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()