1. 程式人生 > >利用python完成大學刷課(從0到完成的思路)

利用python完成大學刷課(從0到完成的思路)

i春秋作家:tllm

原文來自:利用python完成大學刷課(從0到完成的思路)

最近剛剛開學,學校總是有很多讓人無語的課要修,還不能不修。然後我想寫一個自動修課的指令碼。大佬們不要笑我 是邊面向百度學selenium邊寫指令碼的 然後踩了一些坑 記錄一下

先放最終效果視訊

PS:室友在打lol說看見中單 不是說我哈 哈哈哈哈 
http://ow2cltt3t.bkt.clouddn.com/15d3ed600eb39af4d80c4a49088b5c06.mp4

0x01:

首先分析一下它是怎麼驗證你看完這個課的。image.png當學習完成時會發出這個請求image.png然後看看這幾個請求的資料都是在前端哪裡生成的image.png

一番尋找就看到了是wx.js下的function finishWxCourse()  。控制檯執行 finishWxCourse() 果然會發起完成修課的請求image.png

0x02:

然後剩下就是指令碼的思路 首先要獲取課程的連結 然後開啟以後執行js  finishWxCourse() 後來發現requests不是很好的能執行js 然後我就聽從了幾個師傅的意見用selenium...所以是邊學邊寫的 遇到了幾個小坑記一記

安裝不表 網上很多教程 chromedriver裝在環境變數裡面就好了 比如python的環境變數 如果遇到問題可以留言評論

先說一下 程式碼最終的整體思路是 開啟網站----設定cookie----然後通過點選開啟所有的隱藏元素-----定位點選----後退---------------點選開啟所有的隱藏元素-------定位點選----------後退..然後重複之前的步驟

這是簡單的啟動瀏覽器和發起請求

        driver = webdriver.Chrome("C:/Python27/chromedriver.exe")
        driver.get("http://wb.mycourse.cn/")

刪除所有的cookie並設定cookie。我是手動登陸然後再新增    有一個要記住的就是先要請求一次網頁 才能設定cookie 再請求網頁

driver.add_cookie({'name':'JSESSIONID','value':'93BEC0FDEF428F98DA1F69A6B3C2BF88'})  #已經過期的了 師傅們
driver.add_cookie({'name':'acw_tc','value':'7b39758715392684428742395e7ed4b94ed4e9616cb11d4b9df9e244ec7573'})        
driver.add_cookie({'name':'SERVERID','value':'02cc313090e3650844ab417ac43bf774|1539357767|1539357719'})
driver.get("http://wb.mycourse.cn/svnweiban/student/study_studyAndTest.action")

接著就是定位元素了 首先要看到我們要點選的課程連結

image.png

看到class屬性 有一個坑就是這裡多個class屬性 不能直接多個class一起定位 不然會找到 如果全部一起定位要用css尋找並且用.來連結 然後我這裡用的是 courseLink定位 這個名字也很明顯是做什麼的。然後我也發現是98個課程都能定位到  前面幾個class能定位到1000多個

link2s = driver.find_elements_by_class_name("courseLink")

我原本就很開心的以為差不多做完了準備寫出一個這樣子的程式碼

        for i in range(99):
                link2s = driver.find_elements_by_class_name("courseText")
                link2s[i].click()
                driver.execute_script("finishWxCourse()")

但是結果發現無法獲取到元素 什麼鬼 然後一直報錯···苦苦百度以後發現···原來是沒有展開元素 是diplay:none。 隱藏了 然後我百度以後找到的方法一直是 通過執行js把none改為block結果發現不好定位啊

image.png

<div class="widthPercent100 paddingL_30 border-box displayNone" style="transition: all 0.5s ease 0s; display: none;">

class屬性都是不唯一的 然後很蛋疼 後來師傅推薦說通過xpath定位 可是好多個 不想嫌棄麻煩 洗了個澡回來以後發現可以通過定位元素 然後點選元素 來實現自動展開列表

通過 前面截圖的cursorPointer 能夠成功定位20多個地方出來 但是前面幾個定位是什麼首頁 搜尋 不是我們想要的 問題不大。我們刪除這幾個定位就好了

 blockclass = driver.find_elements_by_class_name("cursorPointer")
        del blockclass[0]
        del blockclass[0]
        del blockclass[0]
        for blockc in blockclass:
                blockc.click()

刪除幾個定位就好了 
然後現在除錯以後 集合程式碼跑了一次發現了幾個問題,第一個就是 當

driver.execute_script("finishWxCourse()")    #執行js程式碼

執行程式碼以後,會alert一個窗口出來說 完成了課程。然後就會導致selenium不能點後退 面向百度程式設計以後

  dig_alert = driver.switch_to.alert     #搜尋彈窗
        dig_alert.accept()                     #點選確定

接著就是最後一個坑了driver.back()以後蛋疼了 back以後 之前定位的會失效···所以只能每回退一次重新定位  還有要注意的就是在一些關鍵地方之前要time sleep一秒 不然還沒請求完成出來就執行下一步了 會導致報錯 最後就大功告成了

下面貼完整程式碼

#coding=utf-8

from selenium import webdriver

import time

def login():

        driver = webdriver.Chrome("C:/Python27/chromedriver.exe")

        driver.get("http://wb.mycourse.cn/")

        driver.delete_all_cookies()

        driver.add_cookie({'name':'JSESSIONID','value':'93BEC0FDEF428F98DA1F69A6B3C2BF88'})     #cookie都過期了的 不用試

        driver.add_cookie({'name':'acw_tc','value':'7b39758715392684428742395e7ed4b94ed4e9616cb11d4b9df9e244ec7573'})

        driver.add_cookie({'name':'SERVERID','value':'02cc313090e3650844ab417ac43bf774|1539357767|1539357719'})

        driver.get("http://wb.mycourse.cn/svnweiban/student/study_studyAndTest.action")

        blockclass = driver.find_elements_by_class_name("cursorPointer")

        del blockclass[0]

        del blockclass[0]

        del blockclass[0]

        for blockc in blockclass:

                blockc.click()

        for i in range(99):

                link2s = driver.find_elements_by_class_name("courseText")

                link2s.click()
                driver.execute_script("finishWxCourse()")
                time.sleep(1)
                dig_alert = driver.switch_to.alert
                dig_alert.accept()
                driver.back()
                time.sleep(1)
                blockclass = driver.find_elements_by_class_name("cursorPointer")
                del blockclass[0]
                del blockclass[0]
                del blockclass[0]
                for blockc in blockclass:
                        blockc.click()
                time.sleep(0.5)
login()

 

大家有任何問題可以提問,更多文章可到i春秋論壇閱讀喲~