python網課自動刷課程式-------selenium+chromedriver

對愁眠發表於2019-06-23

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.方法用錯了

 

相關文章