簡單的自動化使用--使用selenium實現學習通網站的刷慕課程序。註釋空格加代碼大概200行不到

簡單的自動化使用--使用selenium實現學習通網站的刷慕課程序。註釋空格加代碼大概200行不到

相見恨晚啊

github地址

環境Python3.6 + pycharm + chrom瀏覽器 + chromdriver

依賴庫selenium,time,random

  • selenium實現自動化控制瀏覽器
  • time和random設置隨機的停留時間,使程序更像是人類在控制。

基本思想:使用Python中的selenium庫來控制chrom瀏覽器來刷慕課,並且是模擬人類點擊物理,至關於物理外掛。

1.實現模擬登陸,選擇省份,學校,輸入帳號,密碼,以及驗證碼。

  • 使用selenium庫來定義一個chrom實例driver。
  • 使用driver來進入登陸網址
  • 使用driver的findelementby_xpath方法來選取省份,學校(這個因我的而不一樣的,程序裏面是須要更改的。

下面界面的網址是:html

1.1點擊選擇單位按鈕,會出現各省份和個學校的列表git

在這裏插入圖片描述

1.2.右擊你所在的省份,點擊檢查(這裏以河南的洛陽理工爲例),右側光標會定位在你所在省份的標籤列,github

在這裏插入圖片描述

 

 

1.3.右擊標籤-->copy--->copy xpath 瀏覽器

在這裏插入圖片描述

 

在這裏插入圖片描述

1.4.把copy以後的代碼複製到從github下載下來的第十四行代碼中,即網絡

  1. # 點擊河南
  2. henan = driver.find_element_by_xpath('要複製的地方')
  3. henan.click()

 

1.5.選擇學校,點擊左側列表中的河南,在右側找到你所在的學校,右擊學校點擊檢查dom

在這裏插入圖片描述

1.6.在右側會光標會顯示在你所在學校的標籤中,右擊--->copy-->copy xpathide

在這裏插入圖片描述

1.7把複製的代碼粘貼到從github下載下來的第22行學習

  1. # 點擊洛陽理工
  2. louyang = driver.find_element_by_xpath('要複製的地方')
  3. louyang.click()

1.8接下來還要修改的代碼部分是你要刷的那個慕課的網址,請確保是下面這個圖中的url連接網站

在這裏插入圖片描述

 

1.9把整個url複製下來以後要替換的是從github下載下來的代碼中的第45行代碼,把url複製到下面要替換的位置url

  1. # 獲得慕課網址
  2. get_url = '要替換的地方網址'
  3. driver.get(get_url)
  4. time.sleep(5)

 

2.接下來就是運行程序,輸入本身的帳號密碼和網頁中的驗證碼。程序就能夠跑起來了,就能夠實現物理外掛來刷課。

在這裏插入圖片描述

 

若是隻是想使用這個程序的話,上面的就已經夠用了。下載github代碼,修改省份,學校,和慕課網址運行程序就能夠開啓物理外掛來刷慕課了。若是想和我一塊兒來維護這個程序的話,能夠看下面的講解,進一步瞭解這一程序的運行原理。

3.接下來就是重點,程序實現的原理。首先獲取一共有多少個章節,遍歷章節,處理網絡不穩定,換公網,點擊播放按鈕,處理答題細節,處理打完題的狀況。

3.0 播放器的html代碼是在頁面下面的ifram中的ifram中的hml代碼裏面要使用driver的switch_to.frame方法來切換到ifram中去。

  • 代碼處理
  1. # 切換到下面的iframe裏
  2. try:
  3. driver.switch_to.frame(driver.find_element_by_xpath('//body/div/div/p/div/iframe'))
  4. except:
  5. driver.switch_to.frame(driver.find_element_by_xpath('//body/div/div/p/span/div/iframe'))

3.1找到全部的章節標籤遍歷。

  • 全部的章節都在//*[@id="coursetree"]/div裏面,使用driver的findelementsby_xpath方法來找到全部標籤,獲取標籤數量,並遍歷

  • 在這裏插入圖片描述

  • 在這裏插入圖片描述

  • 3.1從html代碼中發現每個大章節的第一個標籤和其餘標籤不同,第一章節是在//[@id="coursetree"]/div/div中,而下面的章節是在//[@id="coursetree"]/div中比第一章節少了一個div。能夠使用try-except語句來處理先獲取點擊第一章節或第二章節的標籤,出現異常再點擊另外一個按鈕,這個方法能夠完美的處理遍歷章節中使每個均可以遍歷到

  • 下面是章節不同的圖 在這裏插入圖片描述

  • 下面是處理的代碼

  1. # 點擊章節
  2. try:
  3. driver.find_element_by_xpath('//*[@id="coursetree"]/div[' + str(i + 1) + ']').click()
  4. except:
  5. driver.find_element_by_xpath('//*[@id="coursetree"]/div[' + str(i + 1) + ']/div').click()

3.2點擊播放按鈕,播放按鈕到目前位置發現有兩種一種是直接在視頻框裏面的,另外一種要先點擊視頻切換到視頻框,在點擊播放按鈕。

  • 下面是第一種狀況直接就能夠點擊播放按鈕
  •  在這裏插入圖片描述
  • 下面是第二種狀況,要先點視頻,再點擊播放按鈕
  •  在這裏插入圖片描述
  • 下面是處理這兩種狀況的處理邏輯
  1. # 找到播放按鈕並點擊
  2. try:
  3. button = driver.find_element_by_xpath('//*[@id="reader"]')
  4. button.click()
  5. except:
  6. driver.find_element_by_xpath('//*[@id="dct2"]').click()
  7. driver.find_element_by_xpath('//*[@id="reader"]').click()

3.3處理網絡問題,有時候使用本校的網是不行的,會出現網絡不佳的問題,全部要使用代碼來直接切換到公網按鈕,使用代碼先點擊本校按鈕,再點擊公網2按鈕(直接點擊公網2按鈕是不行的,實驗過了,這些點擊的按鈕的位置都是經過findelementby_xpath來獲取的,和上面方法同樣不在多說。)

  • 下面是實現代碼
  1. # 找到公網
  2. try:
  3. driver.find_element_by_xpath('//*[@id="video"]/div[4]/div[8]/span').click()
  4. driver.find_element_by_xpath('//*[@id="video"]/div[4]/div[8]/div/ul/li[3]/span[1]').click()
  5. except:
  6. pass

3.4像找到快進按鈕啊,靜音按鈕都是一個辦法的。經過findelementby_xpath方法獲得並點擊。

4.下面處理答題,完成視頻,和網絡不佳的狀況。這些邏輯可是在try-except裏面處理的

4.1出現網絡不佳時,使用右擊--->檢查---->右擊copy---->copy xpath來獲取公網2的標籤位置並點擊。

  1. # 當網絡不可用時 點擊公網
  2. try:
  3. driver.find_element_by_xpath('//*[@id="vjserrdisplay-1035"]/ul/li[2]/label').click()
  4. except:
  5. pass

4.2出現答題時找到,視頻中答題位置,找到選擇題選項位置,遍歷每個選項點擊,總有一個是正確的(並且這個答案是不影響總成績的) -代碼實現

  1. # 找到視頻中出現的答題位置
  2. if driver.find_element_by_xpath('//body/div[4]/div/div[7]/span/div/div'):
  3. # 找到選擇題
  4. button3 = driver.find_elements_by_xpath('//body/div[4]/div/div[7]/span/div/div/ul/li')
  5. # print("button3{}", button3)
  6. while driver.find_element_by_xpath('//body/div[4]/div/div[7]/span/div/div'):
  7. # print(1)
  8. # 對選項進行遍歷
  9. for button1 in button3:
  10. button1 = button1.find_element_by_xpath('label')
  11. # print("button1{}", button1)
  12. button1.click()
  13. time.sleep(random.random() * 3)
  14. # 點擊提交按鈕
  15. button5 = driver.find_element_by_xpath('//body/div[4]/div/div[7]/span/div/div/div[2]')
  16. # print("button5{}", button5)
  17. button5.click()
  18. time.sleep(random.random() * 3)
  19. if driver.switch_to.alert():
  20. al = driver.switch_to.alert()
  21. al.accept()
  22. time.sleep(random.random())
  23. if not driver.find_element_by_xpath('//body/div[4]/div/div[7]/span/div/div'):
  24. # print("答題完成")
  25. break
  26. except Exception as e:
  27. # print("未找到答題位置")
  28. time.sleep(random.random() * 3)

4.3判斷視頻是否看完,找到播放標籤,若是播放標籤的文本是‘重播’那麼證實這個視頻已經完成。跳出循環就好。

  • 代碼實現
  1. try:
  2. # 找到重播按鈕
  3. rename = driver.find_element_by_xpath('//*[@id="video"]/div[4]/button[1]').get_attribute('title')
  4. if rename == '重播':
  5. break
  6. except Exception as e:
  7. time.sleep(random.random() * 3)

5返回上一層ifram的上一層ifram繼續下一層 循環。

代碼的不足之處:

-暫時不會判斷視頻是否播放過。

  • 有一條輸出語句中時間標籤獲取不出來。
  • 播放時必須有一臺電腦在運行程序,並且鼠標從頁面出去,或者不進入到頁面中,否則會形成暫停異常。(若是你有一臺雲主機的話,那就完美了)

運行結果:部分截圖

在這裏插入圖片描述

若是有不會之處,或有代碼異常,運行錯誤等,請聯繫下面公衆號,你的反饋會使代碼更加健壯。

在這裏插入圖片描述

相關文章
相關標籤/搜索