python 自動化模組selenium + pyauotogui 模組結合實現有flash顯示自動化運維
最近上一門網路課程。我們知道網路課程是沒辦法加速,而且會有彈窗定時(或者不定時)彈出來;而且你不處理彈窗是無法繼續往下做的,這就導致我們只能是不是檢視一下有沒有彈窗出現,並去處理好,突然就有一個想法,我能不能讓計算機來幫我操作,而我只需要看。
所以本著解決這個問題的想法,我想到了python自動化運維,我採用了selenium庫來處理網路課程,只需要提供賬號密碼(有的需要提供實時的驗證碼),由於識別驗證碼需要其它的庫,簡單起見,所以驗證碼也才有人工輸入。輸入之後,程式自動登入,找到對應的element並執行相應操作。但是這期間出現了幾個小問題,待會一一解答。進入頁面後,發現竟然是flash顯示的iframe,顯然查詢找不到對應的element,查詢所看到的只是一個swf檔案,無法通過selenium進行下一步操作;查詢資料,selenium對flash也是無能為力,flash是as語言開發的,selenium也是沒辦法處理。
雖然吧,問題重重,但是我既然開始了,我的專案我都放開一邊了,我就開始查資料如何解決。控制瀏覽器是不行了,我就想到了簡單的方法,控制滑鼠移動,點選。好傢伙,一找資料,發現還挺多的庫支援的,比如pywin32 和 pyauotogui(簡稱pg),我用了後者。pg (pyautogui的簡稱啊) 使用簡單,好操作吧。它是一種定位畫素座標的方法,我們知道電腦顯示的圖片是有畫素的,包括網頁也是,有的畫素維度高,有的低,不過沒什麼影響的。
簡介:
pyauotogui
主要函式
pg.moveTo(x,y) #移動到座標為(x,y)的位置,位置的定義看上圖,其實就是個直角座標系,至於大小看個人電腦
pg.size()#顯示當前電腦的解析度 我的是 1366 x 768,左上角座標是 (0,0),右下角是(1366,768),函式返回一個二元元組
pg.click(x,y) #控制滑鼠點選(x,y)這個點
im = pg.screenshot() #返回當前點的畫素
im.getpixel((x,y)) #返回(x,y)出的畫素大小
pg.position() #返回滑鼠當前位置
pg.pixelMatchesColor(50,200,(30,132,153)) #判斷(50,200)這個點的畫素值是不是(30,132,153)
loc = pg.loclocateOnScreenloc(image) #image是指圖片的地址,返回的是匹配到的圖片的畫素的4維空間
x,y = pg.center(loc) #獲取圖片的中心座標 ,這個結合上面的就是一個神器,比如網頁定時有同樣的東西彈出來,而且位置不一樣,
那麼我們怎麼自動化處理它,就用上句結合本句就能完全OK,把要彈出來的截個圖當image就OK了,當然有缺點,上面
pg.loclocateOnScreenloc(image)是匹配當前顯示器顯示的畫素裡有沒有和image畫素完全一樣,注意是完全,有一點都不行。(所以有時候會失效)。
selenium:
各種find我就不提了,基本使用看其他博文。
問題1 : 無法操作flash ,已經解決了,用pyauotogui
問題2:出現 no such element等問題,很多時候一個標籤點選後並不是跳轉,而是出現一個小框框,如下
1
第一幅圖是沒有點選的時候,第二幅是點選了登入之後。
我們發現直接find是找不到登入按鈕以及輸入框,原因是你沒有定位到登入框,可以看做是2層吧,他們通過第一幅圖的登入鍵連線,只有點選了才回顯示,否則隱藏。而且這不是iframe原理,所以不需要切換iframe。我們先通過id定位到這個隱藏的登入框,再定位輸入框。你會發現,OK,注意定位登入框要正確,如果你定位了登入框還是出不來result,只能說明,你定位登入框沒有對。
最後,結果完全o得k,實現了自動化上課,1minute 掃描一次是否有提示並處理,另外值得一提的是,這個不是爬蟲,所以不會面臨被限制ip的問題。所以自動化運維還有其他很多用途,比如敏感的 搶火車票,搶購等等,速度計算機快過單身30年男人的手速。
專案擬合性太強,就不上傳了。需要聯絡qq--396202885.