python的強大之處就在於有許多已經寫好的功能庫提供,這些庫強大且易用,對於寫一些有特定功能的小程序十分方便。html
如今就用pyhton的selenium+谷歌遊覽器寫一個能夠自動刷課的程序,以智慧樹上的網課爲例。python
原理說明:selenium 是一套完整的web應用程序測試系統,能夠模擬真實遊覽器,支持多種遊覽器。簡單來講就是能夠定位到html元素,好比按鈕,輸入框之類的,而後模擬點擊,模擬輸入等從而實現自動化效果。selenium難點在於定位元素。web
selenium的一些基本用法:chrome
http://www.javashuo.com/article/p-hdkbwssx-hr.html小程序
一 .開始以前準備ide
1.安裝selenium:在cmd窗口輸入:pip isntaller selenium測試
2.下載谷歌遊覽器的驅動chromedriver:https://pan.baidu.com/s/1_wopkNwvmKvqLlNxY_EagQ (7yxk)網站
3.安裝一個谷歌遊覽器,最好是最新版的ui
二.分析網站spa
要定位元素就要分析網站的一些元素的源代碼是如何寫的。
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.方法用錯了