python的強大之處就在於有許多已經寫好的功能庫提供,這些庫強大且易用,對於寫一些有特定功能的小程式十分方便。
現在就用pyhton的selenium+谷歌遊覽器寫一個可以自動刷課的程式,以智慧樹上的網課為例。
原理說明:selenium 是一套完整的web應用程式測試系統,可以模擬真實遊覽器,支援多種遊覽器。簡單來說就是可以定位到html元素,比如按鈕,輸入框之類的,然後模擬點選,模擬輸入等從而實現自動化效果。selenium難點在於定位元素。
selenium的一些基本用法:
https://blog.csdn.net/weixin_36279318/article/details/79475388
一 .開始之前準備
1.安裝selenium:在cmd視窗輸入:pip isntaller selenium
2.下載谷歌遊覽器的驅動chromedriver:https://pan.baidu.com/s/1_wopkNwvmKvqLlNxY_EagQ (7yxk)
3.安裝一個谷歌遊覽器,最好是最新版的
二.分析網站
要定位元素就要分析網站的一些元素的原始碼是如何寫的。
1.智慧樹的登陸頁面
2.用谷歌遊覽器的審查元素功能檢視元素的原始碼
按右鍵選擇審查或按F12,得到如下的頁面
可以看到輸入手機號那一個輸入框有一個id選擇器,這樣就可以根據id選擇器的名字定位到這個元素。
其它元素也可以用同樣的方法定位元素,然後根據具體情況選擇不同的定位方式。
3.寫程式碼
1 from selenium import webdriver 2 3 import time 4 import threading 5 6 browser=webdriver.Chrome() 7 #請求登陸頁面 8 browser.get('https://passport.zhihuishu.com/login?service=http://online.zhihuishu.com/onlineSchool/') 9 10 #登陸 11 def login(number,password): 12 phone_number=browser.find_element_by_id('lUsername')#通過id定位,手機號碼 13 pwd=browser.find_element_by_id('lPassword')#密碼 14 login_btn=browser.find_element_by_class_name('wall-sub-btn')#登陸按鈕 15 16 phone_number.send_keys(number)#輸入手機號碼 17 pwd.send_keys(password)#輸入密碼 18 login_btn.click()#點選登陸按鈕 19 20 #轉到播放視訊頁面 21 def to_course(key): 22 23 time.sleep(5) 24 current=browser.current_window_handle#當前頁面的控制程式碼 25 key=browser.find_element_by_partial_link_text(key)#找到課程 26 key.click()#跳轉到播放視訊頁面 27 time.sleep(1)#等待頁面載入 28 #因為跳轉到新的頁面,所以browser要切換到新的頁面操作 29 handles=browser.window_handles 30 for handle in handles: 31 if handle!=current: 32 browser.switch_to.window(handle) 33 34 time.sleep(10) 35 try: 36 video=browser.find_element_by_id('mediaplayer')#定位視訊視窗 37 video.click()#點選播放 38 except: 39 pass 40 41 42 43 #判斷是否有答題視窗彈出 44 def is_exist(): 45 while True: 46 try: 47 browser.switch_to.default_content() 48 browser.switch_to.frame('tmDialog_iframe')#答題視窗在另一個frame裡面,要切換 49 box=browser.find_elements_by_class_name('answerOption')#答題列表 50 radio=box[0].find_element_by_tag_name('input')#找到第一個選項 51 radio.click()#選擇 52 browser.switch_to.default_content() 53 browser.find_element_by_link_text('關閉').click()#關閉答題視窗 54 except: 55 browser.switch_to.parent_frame()#沒有彈出,切換回本來的frame 56 time.sleep(5) 57 58 #判斷當前視訊是否結束 59 def is_end(): 60 while True: 61 try: 62 video=browser.find_element_by_id('mediaplayer')#定位視訊視窗 63 #獲取當前播放的進度 64 current_time=video.find_element_by_class_name('currentTime').get_attribute('textContent') 65 #該視訊的總時間 66 total_time=video.find_element_by_class_name('duration').get_attribute('textContent') 67 print(current_time,total_time) 68 if current_time==total_time: 69 #當前視訊播放結束,點選下一節 70 js="document.ElementById('nextBtn').click()"#js指令碼 71 browser.execute_script(js) 72 73 time.sleep(10)#10秒檢測一次 74 except: 75 current_time='00:00' 76 total_time='00:01' 77 78 79 80 if __name__=='__main__': 81 82 ''' 83 number=''#手機號碼 84 password=''#密碼 85 key=''#課程名稱,可以部分名字 86 87 ''' 88 login(number,password) 89 to_course(key) 90 #開兩個執行緒 91 t1=threading.Thread(target=is_exist) 92 t2=threading.Thread(target=is_end) 93 t2.start() 94 time.sleep(3) 95 t1.start() 96 t2.join() 97 t1.join() 98 99 100 101
登陸過程:
-------------
這個程式只是做一個簡單的演示,並沒有做到很全面,但也可以用的。
selenium定位不到元素時會報錯,要處理好,否則程式就沒用了。元素定位最好使用WebDriverWait的方式,加上異常控制。
網站是會變化的,分析好網站操作基本的過程,基本沒有問題了。
selenium定位不到元素有以下幾種情況
1.通過class定位時,有時定位不到
2.頁面沒有載入出來,元素無法定位
3.元素不可見,無法定位
4.元素被其它元素遮擋了
5.方法用錯了