1. 程式人生 > 其它 >Python+Selenium+PIL+Tesseract真正自動識別驗證碼進行一鍵登入

Python+Selenium+PIL+Tesseract真正自動識別驗證碼進行一鍵登入

Python 2.7 IDE Pycharm 5.0.3 Firefox瀏覽器:47.0.1

PIL : Pillow-3.3.0-cp27-cp27m-win_amd64.whl

PIL第三方庫的下載 win下安裝whl檔案

http://www.cnblogs.com/2589-spark/p/4501816.html

Pytesser:依賴於PIL ,Tesseract 瞭解pytesser及基本使用

http://blog.sina.com.cn/s/blog_5d56279201017fta.html

Tesseract:3.0.2 tesseract下載及安裝

http://blog.csdn.net/wanghui2008123/article/details/37694307


我有個理想,就是把TMD教務系統弄崩潰,我港真的!

扯淡

我相信每個指令碼都有自己的故事,我這個指令碼來源於自己GRD教務系統,每次進行登入時,即使我輸入全部正確,第一次登入一定是登不上去的!我不知道設計人員什麼想法?難道是為了反爬機制?你以為一次登不上,我tm就不爬了?我要是不高興了,信不信秒秒鐘訪問你1000+讓大家都上不去咯~咳咳,有點跑題了。

目的

自動識別驗證碼模擬登陸,注意是自動,一鍵登入,不是那種掃出驗證碼,然後手動輸入登入!

第一次放動圖,心理還有點小激動~


遇到問題及解決方法

1:驗證碼取得問題,因為每次重新整理之後驗證碼動態重新整理,所以如果不採用cookie的話(我還不太會用cookie),根本捉不到元素,這個我在下篇文章中採用cookie來登入的,但不是呼叫瀏覽器,這個跑遠了,下次說。

1:解決方案:用了driver.get_screenshot_as_file方法,機智的進行全截圖,然後採用PIL中的crop進行再截圖操作,可能有人會說,為什麼不採用ImageGrab.grab()函式來做,好吧,因為這個函式在win10上盡然!截不了全圖!!自己試了才知道,btw,我的解析度1920x1080,難道和解析度有關?反正這個我截了好久都沒有成功,到最後才想到,截全部看看,結果,tmd只有一半,我說怎麼都找不到要截圖的部分!

2:驗證碼驗證錯誤率高問題

2:解決方案,採用PIL強大的影象處理功能,我先將圖片二值化,本來是藍色字型的,,然後再進行對比度強化來銳化圖片,然後再呼叫Tesseract.exe進行處理,提高的識別精度不是一點兩點:看圖比較,左1是用cookie抓的原圖,右邊是全景截圖,再定位截圖,再進行二值化和銳化處理的圖,本來我想著用matlab做影象識別的,但是想想還要呼叫,感覺有點麻煩。。。


3:呼叫Tesseract.exe問題 3:解決方案因為程式執行影象識別需要呼叫Tesseract.exe,所以必須把路徑切到有這個exe的路徑下,剛開始,以為和包依賴,結果根本沒有識別出任何圖!折騰一個多小時才寫好驗證碼識別的問題—-單獨測試的確很重要,記一筆!

4:登入失敗問題–mdzz學校教務系統二次驗證

4:解決方案,寫了一個while迴圈,把主程式很大部分都扔進去了,目的也很明確,如果第一次登入失敗,再重複進行登入,注意採用try試探元素是否仍然存在,except來丟擲break結束迴圈,因為登入成功後,比如說driver.find_element_by_name('id')是不存在的!所以當這個元素在登陸後的介面找不到時,那就說明登入成功,ok,跳出迴圈,進行下一步操作。

5:明明圖片已擷取,為什麼沒有識別 5:解決方案,這個我真的沒想到,我一直以為可能因為save時候還沒下載好,導致庫中沒有這張圖,那就不能識別,但是我用time.sleep函式讓它停下來緩緩,還是不行,我就很無語了,想了半天,可能是因為圖片被佔用!因為我有一個img.show()函式,為了檢測有沒有擷取到標準的圖,然後show之後這個影象就被佔用了!就像你在編輯word時候,是無法刪除word文件一樣!果然在註釋掉show之後,一切可行,真是差錯查了小半天啊!!

6:元素一切就位,為什麼不執行操作 6:解決方案,這個有點腦殘了,不過的確是我遇到的,還是記上一筆,然後罵自己一遍sb,沒有click()你讓它怎麼處理!!!就像用cookie登入時候還有個ENTRY呢!

7:兩次驗證失敗後,使用者名稱重複累加 7:解決方案,直接加了個變數,計數迴圈次數,觀察到只要超過兩次沒有登入上,就會累加登入名和使用者密碼,直接寫了個if進行判斷,完事!

8:im.crop(box)裁剪區域選擇困難症 8:解決方案,多試幾次,反正我是試出來的。。。。當然,你點選圖片進行審查元素時候,可以看到圖片大小,那麼,你就可以知道橫縱座標差值多少,但是大範圍區域還得自己試,如有更好的辦法,請告知,以下為我截圖實驗次數,次數30+


9:匯入不了Image,ImageEnhance 9:解決方案,因為PIL用的是第三方庫,所以,採用的匯入方式是這樣的,多看看官方文件就可以,官方描述如下 Usefrom PIL import Imageinstead ofimport Image.


10:找不到應該鍵入的元素 10:這個問題,請單擊要輸入的空白處右鍵,審查元素,就可以看到,然後根據driver.find_element_by_各種方法來定位元素,如果輸入進行了隱藏,在當前頁面找不到怎麼辦,就像如下圖,需要先點選我的圖書館,才能看到輸入的賬戶和密碼,那麼先找我的圖書館的元素,進行click操作,之後再找元素,一句話,把自己想成瀏覽器,阿不,把python想成瀏覽器。。。。。

上圖的程式碼我也放上,大同小異,比有驗證碼的簡單,但是多了一個click操作。

斷斷續續差不多兩天時間來實現這個操作,雖然對大家來說應該不算難,但是對自己還是有蠻大提升的,對selenium有了基本的概念和操作,對PIL也進行了使用,還有ocr的呼叫,雖然呼叫firefox來執行操作表面上看起來很酷炫,但是執行效率和佔用記憶體是很大的內傷,但作為視覺化的模擬瀏覽器登入,這點做的還是十分絢麗的。