Python+Selenium+PIL+Tesseract真正自動(dòng)識(shí)別驗(yàn)證碼進(jìn)行一鍵登錄

Python 2.7
IDE Pycharm 5.0.3

Selenium:Selenium的介紹及使用哆姻,強(qiáng)烈推薦@ Eastmount的博客

PIL : Pillow-3.3.0-cp27-cp27m-win_amd64.whl PIL第三方庫(kù)的下載
win下安裝whl文件

Pytesser:依賴于PIL ,Tesseract 了解pytesser及基本使用

Tesseract:3.0.2 tesseract下載及安裝

Firefox瀏覽器:47.0.1


我有個(gè)理想胞谈,就是把TMD教務(wù)系統(tǒng)弄崩潰,我港真的憨愉!

扯淡

我相信每個(gè)腳本都有自己的故事,我這個(gè)腳本來(lái)源于自己GRD教務(wù)系統(tǒng)卿捎,每次進(jìn)行登錄時(shí)配紫,即使我輸入全部正確,第一次登錄一定是登不上去的午阵!我不知道設(shè)計(jì)人員什么想法躺孝?難道是為了反爬機(jī)制?你以為一次登不上底桂,我tm就不爬了植袍?我要是不高興了,信不信秒秒鐘訪問(wèn)你1000+讓大家都上不去咯~咳咳籽懦,有點(diǎn)跑題了于个。


這里寫圖片描述
這里寫圖片描述

目的

自動(dòng)識(shí)別驗(yàn)證碼模擬登陸,注意是自動(dòng)暮顺,一鍵登錄厅篓,不是那種掃出驗(yàn)證碼,然后手動(dòng)輸入登錄捶码!

首先來(lái)代碼實(shí)現(xiàn)吧羽氮!

# -*- coding: utf-8 -*-
#Author:哈士奇說(shuō)喵
from selenium import webdriver
import os
import pytesser
import sys,time
from PIL import Image,ImageEnhance

#shift+tab多行縮進(jìn)(左)
reload(sys)
PostUrl = "http://yjsymis.hrbeu.edu.cn/gsmis/indexAction.do"

driver=webdriver.Firefox()
driver.get(PostUrl)


i=0
while 1:#sb登錄系統(tǒng),即使輸對(duì)所有消息還是登不進(jìn)去的惫恼,需要登錄兩次及以上

    i=i+1
    try:
        elem_user = driver.find_element_by_name('id')
        elem_psw = driver.find_element_by_name('password')
        elem_code = driver.find_element_by_name('checkcode')
    except:
        break
    #-------------------對(duì)驗(yàn)證碼進(jìn)行區(qū)域截圖档押,好吧,這方法有點(diǎn)low------------------
    driver.get_screenshot_as_file('C:\Users\MrLevo\image1.jpg')#比較好理解
    im =Image.open('C:\Users\MrLevo\image1.jpg')
    box = (516,417,564,437)  #設(shè)置要裁剪的區(qū)域
    region = im.crop(box)     #此時(shí)祈纯,region是一個(gè)新的圖像對(duì)象令宿。
    #region.show()#顯示的話就會(huì)被占用,所以要注釋掉
    region.save("e:/image_code.jpg")

    #-------------------------------------------------------------------

    #--------------ImageGrab.grab()直接可以區(qū)域截圖盆繁,但是有bug掀淘,截圖不全-------
    '''
    bbox = (780, 0, 1020, 800)
    img = ImageGrab.grab()
    img.save("E:\image_code.jpg")
    img.show()
    '''
    #-------------------------手動(dòng)輸入驗(yàn)證碼:適用范圍更廣,但不夠方便------------------------------
    '''
    response = opener.open(CaptchaUrl)
    picture = response.read()
    with open('e:/image.jpg', 'wb') as local:
        local.write(picture)
    # 保存驗(yàn)證碼到本地

    #------------對(duì)于不能用pytesser+ocr進(jìn)行識(shí)別油昂,手動(dòng)打開圖片手動(dòng)輸入--------
    # 打開保存的驗(yàn)證碼圖片 輸入
    #SecretCode = raw_input('please enter the code: ')
    #----------------------------------------------------------------------
    '''

    #--------------------圖片增強(qiáng)+自動(dòng)識(shí)別簡(jiǎn)單驗(yàn)證碼-----------------------------
    #time.sleep(3)防止由于網(wǎng)速革娄,可能圖片還沒保存好倾贰,就開始識(shí)別
    def image_file_to_string(file):
        cwd = os.getcwd()
        try :
            os.chdir("C:\Users\MrLevo\Anaconda2\Lib")
            return pytesser.image_file_to_string(file)
        finally:
            os.chdir(cwd)
    im=Image.open("E:\\image_code.jpg")
    imgry = im.convert('L')#圖像加強(qiáng),二值化
    sharpness =ImageEnhance.Contrast(imgry)#對(duì)比度增強(qiáng)
    sharp_img = sharpness.enhance(2.0)
    sharp_img.save("E:\\image_code.jpg")
    #http://www.cnblogs.com/txw1958/archive/2012/02/21/2361330.html
    #imgry.show()#這是分布測(cè)試時(shí)候用的拦惋,整個(gè)程序使用需要注釋掉
    #imgry.save("E:\\image_code.jpg")

    code= pytesser.image_file_to_string("E:\\image_code.jpg")#code即為識(shí)別出的圖片數(shù)字str類型
    print code
    #打印code觀察是否識(shí)別正確


    #----------------------------------------------------------------------
    if i <= 2: # 根據(jù)自己登錄特性匆浙,我這里是驗(yàn)證碼失敗一次,重填所有厕妖,失敗兩次首尼,重填驗(yàn)證碼
        elem_user.send_keys('S315080092')
        elem_psw.send_keys('xxxxxxxxxx')

    elem_code.send_keys(code)
    click_login = driver.find_element_by_xpath("http://img[@src='main_images/images/loginbutton.gif']")
    click_login.click()


#time.sleep(5)#搜索結(jié)果頁(yè)面停留片刻
#driver.save_screenshot('C:\Users\MrLevo\image.jpg')
#driver.close()
#driver.quit()

第一次放動(dòng)圖,心理還有點(diǎn)小激動(dòng)~

實(shí)現(xiàn)登陸
實(shí)現(xiàn)登陸

遇到問(wèn)題及解決方法

1:驗(yàn)證碼取得問(wèn)題言秸,因?yàn)槊看嗡⑿轮篁?yàn)證碼動(dòng)態(tài)刷新软能,所以如果不采用cookie的話(我還不太會(huì)用cookie),根本捉不到元素,這個(gè)我在下篇文章中采用cookie來(lái)登錄的举畸,但不是調(diào)用瀏覽器查排,這個(gè)跑遠(yuǎn)了,下次說(shuō)抄沮。
1:解決方案:用了driver.get_screenshot_as_file方法跋核,機(jī)智的進(jìn)行全截圖,然后采用PIL中的crop進(jìn)行再截圖操作叛买,可能有人會(huì)說(shuō)砂代,為什么不采用ImageGrab.grab()函數(shù)來(lái)做,好吧率挣,因?yàn)檫@個(gè)函數(shù)在win10上盡然刻伊!截不了全圖!椒功!自己試了才知道娃圆,btw,我的分辨率1920x1080蛾茉,難道和分辨率有關(guān)讼呢?反正這個(gè)我截了好久都沒有成功,到最后才想到谦炬,截全部看看悦屏,結(jié)果,tmd只有一半键思,我說(shuō)怎么都找不到要截圖的部分础爬!


2:驗(yàn)證碼驗(yàn)證錯(cuò)誤率高問(wèn)題
2:解決方案,采用PIL強(qiáng)大的圖像處理功能吼鳞,我先將圖片二值化看蚜,本來(lái)是藍(lán)色字體的,赔桌,然后再進(jìn)行對(duì)比度強(qiáng)化來(lái)銳化圖片供炎,然后再調(diào)用Tesseract.exe進(jìn)行處理渴逻,提高的識(shí)別精度不是一點(diǎn)兩點(diǎn):看圖比較,左1是用cookie抓的原圖音诫,右邊是全景截圖惨奕,再定位截圖,再進(jìn)行二值化和銳化處理的圖竭钝,本來(lái)我想著用matlab做圖像識(shí)別的梨撞,但是想想還要調(diào)用,感覺有點(diǎn)麻煩香罐。卧波。。

對(duì)比圖

3:調(diào)用Tesseract.exe問(wèn)題
3:解決方案因?yàn)槌绦驁?zhí)行圖像識(shí)別需要調(diào)用Tesseract.exe庇茫,所以必須把路徑切到有這個(gè)exe的路徑下幽勒,剛開始,以為和包依賴港令,結(jié)果根本沒有識(shí)別出任何圖!折騰一個(gè)多小時(shí)才寫好驗(yàn)證碼識(shí)別的問(wèn)題----單獨(dú)測(cè)試的確很重要锈颗,記一筆顷霹!


這里寫圖片描述
這里寫圖片描述

4:登錄失敗問(wèn)題--mdzz學(xué)校教務(wù)系統(tǒng)二次驗(yàn)證
4:解決方案,寫了一個(gè)while循環(huán)击吱,把主程序很大部分都扔進(jìn)去了淋淀,目的也很明確,如果第一次登錄失敗覆醇,再重復(fù)進(jìn)行登錄朵纷,注意采用try試探元素是否仍然存在,except來(lái)拋出break結(jié)束循環(huán)永脓,因?yàn)榈卿洺晒笈鄞牵热缯f(shuō)driver.find_element_by_name('id')是不存在的!所以當(dāng)這個(gè)元素在登陸后的界面找不到時(shí)常摧,那就說(shuō)明登錄成功搅吁,ok,跳出循環(huán)落午,進(jìn)行下一步操作谎懦。


5:明明圖片已截取,為什么沒有識(shí)別
5:解決方案溃斋,這個(gè)我真的沒想到界拦,我一直以為可能因?yàn)閟ave時(shí)候還沒下載好,導(dǎo)致庫(kù)中沒有這張圖梗劫,那就不能識(shí)別享甸,但是我用time.sleep函數(shù)讓它停下來(lái)緩緩截碴,還是不行,我就很無(wú)語(yǔ)了枪萄,想了半天隐岛,可能是因?yàn)閳D片被占用!因?yàn)槲矣幸粋€(gè)img.show()函數(shù)瓷翻,為了檢測(cè)有沒有截取到標(biāo)準(zhǔn)的圖聚凹,然后show之后這個(gè)圖像就被占用了!就像你在編輯word時(shí)候齐帚,是無(wú)法刪除word文檔一樣妒牙!果然在注釋掉show之后,一切可行对妄,真是差錯(cuò)查了小半天跋娼瘛!剪菱!


這里寫圖片描述

6:元素一切就位摩瞎,為什么不執(zhí)行操作
6:解決方案,這個(gè)有點(diǎn)腦殘了孝常,不過(guò)的確是我遇到的旗们,還是記上一筆,然后罵自己一遍sb构灸,沒有click()你讓它怎么處理I峡省!喜颁!就像用cookie登錄時(shí)候還有個(gè)ENTRY呢稠氮!


7:兩次驗(yàn)證失敗后,用戶名重復(fù)累加
7:解決方案半开,直接加了個(gè)變量隔披,計(jì)數(shù)循環(huán)次數(shù),觀察到只要超過(guò)兩次沒有登錄上寂拆,就會(huì)累加登錄名和用戶密碼锹锰,直接寫了個(gè)if進(jìn)行判斷,完事漓库!


8:im.crop(box)裁剪區(qū)域選擇困難癥
8:解決方案恃慧,多試幾次,反正我是試出來(lái)的渺蒿。痢士。。。當(dāng)然怠蹂,你點(diǎn)擊圖片進(jìn)行審查元素時(shí)候善延,可以看到圖片大小,那么城侧,你就可以知道橫縱坐標(biāo)差值多少易遣,但是大范圍區(qū)域還得自己試,如有更好的辦法嫌佑,請(qǐng)告知豆茫,以下為我截圖實(shí)驗(yàn)次數(shù),次數(shù)30+


這里寫圖片描述
這里寫圖片描述

9:導(dǎo)入不了Image,ImageEnhance
9:解決方案屋摇,因?yàn)镻IL用的是第三方庫(kù)揩魂,所以,采用的導(dǎo)入方式是這樣的炮温,多看看官方文檔就可以火脉,官方描述如下
Usefrom PIL import Imageinstead ofimport Image.


10:找不到應(yīng)該鍵入的元素
10:這個(gè)問(wèn)題,請(qǐng)單擊要輸入的空白處右鍵柒啤,審查元素倦挂,就可以看到,然后根據(jù)driver.find_element_by_各種方法來(lái)定位元素担巩,如果輸入進(jìn)行了隱藏方援,在當(dāng)前頁(yè)面找不到怎么辦,就像如下圖兵睛,需要先點(diǎn)擊我的圖書館,才能看到輸入的賬戶和密碼窥浪,那么先找我的圖書館的元素祖很,進(jìn)行click操作,之后再找元素漾脂,一句話假颇,把自己想成瀏覽器,阿不骨稿,把python想成瀏覽器笨鸡。。坦冠。形耗。。

登陸圖書館

上圖的代碼我也放上辙浑,大同小異激涤,比有驗(yàn)證碼的簡(jiǎn)單,但是多了一個(gè)click操作判呕。

# -*- coding: utf-8 -*-
#Author:哈士奇說(shuō)喵
from selenium import webdriver
import time
import sys


#shift+tab多行縮進(jìn)(左)
reload(sys)
PostUrl = "http://lib.hrbeu.edu.cn/#"
driver=webdriver.Firefox()
driver.get(PostUrl)

elem_user = driver.find_element_by_name('number')
elem_psw = driver.find_element_by_name('passwd')

#選擇我的圖書館倦踢,點(diǎn)擊后才能看到輸入賬號(hào)密碼
click_first = driver.find_element_by_xpath("http://ul[@id='imgmenu']/li[4]")
click_first.click()
elem_user.send_keys('S315080092')
elem_psw.send_keys('xxxxxxxx')

#點(diǎn)擊登錄
click_second = driver.find_element_by_name('submit')
click_second.click()

time.sleep(5)
#登陸后選擇
click_third = driver.find_element_by_xpath("http://*[@id='mainbox']/div/div/ul/li/a")
click_third.click()

time.sleep(5)#搜索結(jié)果頁(yè)面停留片刻
#driver.save_screenshot('C:\Users\MrLevo\image.jpg')

driver.close()
driver.quit()

最后

(雖然我知道以后肯定會(huì)再補(bǔ)充):斷斷續(xù)續(xù)差不多兩天時(shí)間來(lái)實(shí)現(xiàn)這個(gè)操作送滞,雖然對(duì)大家來(lái)說(shuō)應(yīng)該不算難,但是對(duì)自己還是有蠻大提升的辱挥,對(duì)selenium有了基本的概念和操作犁嗅,對(duì)PIL也進(jìn)行了使用,還有ocr的調(diào)用晤碘,雖然調(diào)用firefox來(lái)執(zhí)行操作表面上看起來(lái)很酷炫褂微,但是執(zhí)行效率和占用內(nèi)存是很大的內(nèi)傷,但作為可視化的模擬瀏覽器登錄哼蛆,這點(diǎn)做的還是十分絢麗的蕊梧。
話說(shuō)今天登了圖書館才知道,我tm過(guò)期書好幾本了腮介,好幾天了肥矢,,叠洗,甘改,看來(lái)得寫個(gè)一鍵續(xù)期和查詢過(guò)期圖書的小工具了,so灭抑,又有動(dòng)力了十艾!

so peace out,guys腾节,and good night忘嫉!


這里寫圖片描述

致謝

這些博客真的給我很大幫助,謝謝博主們:
1.tesseract-ocr識(shí)別英文和中文圖片文字以及掃描圖片實(shí)例講解
2.用pytesser作圖片驗(yàn)證碼識(shí)別
3. [Python爬蟲] Selenium實(shí)現(xiàn)自動(dòng)登錄163郵箱和Locating Elements介紹
4. [Python爬蟲] Selenium自動(dòng)訪問(wèn)Firefox和Chrome并實(shí)現(xiàn)搜索截圖
5.初試PIL及基本操作
6.Python爬蟲模擬登錄帶驗(yàn)證碼網(wǎng)站_手動(dòng)輸入驗(yàn)證碼版本
7.selenium-webdriver(python) (十五) -- 鼠標(biāo)事件

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末案腺,一起剝皮案震驚了整個(gè)濱河市庆冕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌劈榨,老刑警劉巖访递,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異同辣,居然都是意外死亡拷姿,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門旱函,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)响巢,“玉大人,你說(shuō)我怎么就攤上這事棒妨〉峙遥” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)灾炭。 經(jīng)常有香客問(wèn)我茎芋,道長(zhǎng),這世上最難降的妖魔是什么蜈出? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任田弥,我火速辦了婚禮,結(jié)果婚禮上铡原,老公的妹妹穿的比我還像新娘偷厦。我一直安慰自己,他們只是感情好燕刻,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布只泼。 她就那樣靜靜地躺著,像睡著了一般卵洗。 火紅的嫁衣襯著肌膚如雪请唱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天过蹂,我揣著相機(jī)與錄音十绑,去河邊找鬼。 笑死酷勺,一個(gè)胖子當(dāng)著我的面吹牛本橙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播脆诉,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼甚亭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了击胜?” 一聲冷哼從身側(cè)響起亏狰,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎潜的,沒想到半個(gè)月后骚揍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體字管,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡啰挪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嘲叔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片唠粥。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡屿笼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情嫂粟,我是刑警寧澤叉抡,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響梭姓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嫩码,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一誉尖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧铸题,春花似錦铡恕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至烘挫,卻和暖如春诀艰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背墙牌。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工涡驮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人喜滨。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓捉捅,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親虽风。 傳聞我的和親對(duì)象是個(gè)殘疾皇子棒口,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容