网课邦

当前位置:首页 > 网课资讯

网课资讯

2023新版智慧树刷课代码(利用Python脚本实现智慧树自动看视频答题)

时间:2025-06-05 01:11:24 作者:暂无作者 浏览量:
内容页左侧

目录

  • 一、原理介绍

  • 二、准备工作

    • 1&xff09;安装Python3 (反正安装最新版本)

    • 2&xff09;安装Chrome & ChromeDriver

    • 3&xff09;在Python中安装Selenium库

    • 4&xff09;编辑环境

    三、实现

      • 一自动打开并且登陆网站

      • 二实现自动登陆

      • 三选择课程

      • 四选择章节和讲数

      四、源代码

      五、最后

      赛季末如何实现自动刷掉毫无意义的网课

      (双枪) 双手会给出答案

      不妨自己动手用Python试一试。只想看源代码的可以直接滑到文章的最底部。

      阅读前你可能需要&xff1a;

      1. Python基础 / 相关编程基础2. HTML 等前端方面的相关知识3. 浏览器 (本人使用的是Chrome)4. 浏览器对应版本的Driver5. Python中安装好Selenium库6. 还没刷完 且 毫无意义的网课

      一、原理介绍

      Python中有个名为Selenium的库&xff0c;是一种知名的自动化测试库&xff0c;利用它&xff0c;可以实现浏览器中的点击、输入等操作&xff0c;从而实现自动化刷课(或者其他合法的事情&xff09;

      所以只要分析网页的源代码&xff0c;就能实现自动化操作网页。

      在模拟操作的过程中&xff0c;必须提前知道即将发生什么&xff0c;才能圆满的自动化测试。

      二、准备工作

      1&xff09;安装Python3 (反正安装最新版本)

      官网搜索就行

      (安装完后在终端自查&xff1a;输入python&xff0c;如图则安装完成)

      2&xff09;安装Chrome & ChromeDriver

      浏览器就不多说了&xff0c;这里给出Driver的地址

      chromedriver.storage.googleapis.com/index.html

      (python安装目录script中放入对应版本的driver)

      3&xff09;在Python中安装Selenium库

      安装前其实要先安装pip&xff0c;默认安装是有勾选的&xff0c;而且这里网上有很多方法了&xff0c;不多赘述。

      安装好pip后可以在终端命令行中输入

      pip install selenium

      &xff08;安装selenium中&xff09;

      (自查安装是否完成&xff1a;pip show selenium)

      4&xff09;编辑环境

      在系统中把python的目录添加进去就行&xff0c;网络上也有很多&xff0c;不多赘述。

      三、实现

      (一)自动打开并且登陆网站

      选择那啥的平台&xff0c;这里使用mooc作为演示

      获取它的URL

      引用库from selenium import webdriverfrom selenium.webdriver.common.keys import Keysfrom selenium.webdriver.common.by import By?全局变量区域url = "https://www.icourse163.org/"driver = webdriver.Chrome()??打开网页最好全屏driver.get(url)driver.maximize_window()

      运行代码就能看见浏览器自动打开并且进入了mooc

      但是由于自动化测试软件打开的浏览器没有cookie&xff0c;不会识别用户

      所以需要设计一下自动登陆的部分

      &xff08;二&xff09;实现自动登陆

      在浏览器中按F12 打开调试台 再点击这个按钮

      这个是元素选择器&xff0c;选择那个绿色的“登陆/注册”

      之后会跳出对应的

      标签&xff0c;复制它的FULL XPath

      (确定元素位置有很多种方式&xff0c;xpath是相对准确的一种&xff0c;确定元素位置相当于告诉电脑你该在哪里进行操作)

      (演示,gif中复制的是xpath&xff0c;应该复制full xpath)

      自己点击后可以发现&xff0c;出来默认是扫码登陆&xff0c;我们选择其他方式登陆&xff0c;这里用邮箱演示。

      可以声明一下变量(在python中是注释符&xff09;

      全局变量区域url = "https://www.icourse163.org/"driver = webdriver.Chrome()account = &9;@163.com&9; 改成自己的账户password = &9;&9; 改成自己的密码

      刚刚复制的xpath在这里 (这里其实复制的是full xpath&xff0c;mooc对xpath有随机数的id&xff0c;每次打开都不一样,所以用full xpath)

      /html/body/div[4]/div[2]/div[1]/div/div/div[1]/div[3]/div[3]/div

      重复上述操作找到各个按钮的xpath&xff0c;在代码中添加几个点击的动作

      为了方便调试&xff0c;大多数操作采用try-expcet语句

      (但是前期敲代码的时候&xff0c;建议先不要用try-except语句&xff0c;因为编译器报错的信息更有用)

      mooc网点击登陆后&xff0c;会弹出新的小页面&xff0c;由于weddriver每次只能识别一个页面&xff0c;这里直接.switch_to_frame()

      登陆部分try:driver.find_element(By.XPATH, &9;/html/body/div[4]/div[2]/div[1]/div/div/div[1]/div[3]/div[3]/div&9;).click()driver.find_element(By.XPATH, &9;/html/body/div[13]/div[2]/div/div/div/div/div[2]/span&9;).click()print(&9;点击登陆按钮成功&9;)except:print(&9;点击登陆按钮时出错&9;)??输入账号密码部分try:driver._switch_to.frame(0) 这里转到fame0 因为mooc网站点击登陆后是弹窗的driver.find_element(By.XPATH, &9;/html/body/div[2]/div[2]/div[2]/form/div/div[1]/div[2]/input&9;).send_keys(account)driver.find_element(By.XPATH, &9;/html/body/div[2]/div[2]/div[2]/form/div/div[3]/div[2]/input[2]&9;).send_keys(password)print(&9;输入账号密码成功&9;)driver.find_element(By.XPATH, &9;/html/body/div[2]/div[2]/div[2]/form/div/div[8]/a&9;).click()except:print(&9;登陆失败&9;)

      上述代码中&xff0c;总体来说&xff0c;为了便于理解&xff0c;是这样一个伪代码

      driver.查找元素的方法(&9;元素的位置&9;).操作()find_element(By.XPATH,&9;xpath的内容&9;)就是通过xpath来确定元素位置.click()就是点击的操作&xff0c; .send_keys(参数)就是输入的操作

      这一步完成后应该是这样的效果(登陆次数非常多的时候&xff0c;可能会有滑动验证)

      &xff08;三&xff09;选择课程

      如果上述操作都能够掌握&xff0c;后面的其实就只是重复步骤而已&xff0c;教程其实可以到这里就结束了。

      如果还想继续看&xff0c;请往下滑。

      接下来是点击头像进入课程界面&xff0c;选择课程。

      注意&xff1a;这时候webdriver聚焦在刚刚的frame上&xff0c;先改回主页面&xff0c;然后点击头像就能进入“我的课程”界面

      try:driver.switch_to.default_content()driver.find_element(By.XPATH,&9;/html/body/div[4]/div[2]/div[1]/div/div/div[1]/div[3]/div[1]/img&9;).click()print("点击头像成功")except:print("点击头像出错")

      接下来这里用 “高等数学&xff08;一&xff09;” 作为演示

      继续获取元素的XPATH&xff0c;重复操作即可

      time.sleep(2)点击 高等数学&xff08;一&xff09; 课程try:driver.find_element(By.XPATH,&9;/html/body/div[4]/div[2]/div[3]/div/div[1]/div[3]/div/div[2]/div/div/div[2]/div[1]/div[2]/div/div[1]/div[1]/div[1]/a/div[1]/img&9;).click()print("点击 &9;高等数学&xff08;一&xff09;&9;成功"&xff09;except:print("点击课程失败")time.sleep(4)点击继续学习try:driver.switch_to.window(driver.window_handles[-1])driver.find_element(By.XPATH,&9;/html/body/div[4]/div[2]/div[4]/div[2]/div/div[1]/div/div[1]/div/div[1]/div/a[1]&9;).click()print(&9;点击继续学习成功&9;)except:print("点击继续学习失败"&xff09;

      由于mooc网有自动播放功能&xff0c;但是没有自动看课件的功能&xff0c;这里演示观看每节课的课件

      PS:其他网课网站&xff08;智慧树&xff09;有一些是没有自动播放的&xff0c;非常反人类&xff0c;这时候就能运用上面的方法实现自动播放。

      分析网页源代码发现&xff0c;一套课程分为chapter和lesson俩个部分

      (红蓝箭头一一对应)

      在lesson的每一节中都有下面的几个

      • 标签

      分析这一行格子的源代码可以发现

      在当前的界面中&xff0c;li标签中的class属性中多了个current

      然后各个li标签的full xpath是有一定规律的

      (可以看见后缀是递增的)

      上面说了&xff0c;这里只演示全部看完课件&xff0c;核心方法掌握了&xff0c;就能触类旁通了。

      后来发现&xff0c;classname似乎锁定不到这个元素&xff0c;只能暴力破解了。(有好方法的请联系我)

      一行最多不过10个格子

      归纳出来是这样的

      /html/body/div[4]/div[2]/...(省略)/ul/li[数字]

      所以可以通过只改变后面[数字]就行&xff0c;每次都点击一下,先在全局变量中利用列表存储一下’[数字]’。

      全局变量区域lists=[&9;1&9;,&9;2&9;,&9;3&9;,&9;4&9;,&9;5&9;,&9;6&9;,&9;7&9;,&9;8&9;,&9;9&9;,&9;10&9;,]

      用for循环遍历列表(其实这里已经可以实现自动播放了&xff0c;只要设置好第二个tiem.sleep()的参数就行)

      for i in lists:time.sleep(2)driver.find_element(By.XPATH,&9;/html/body/div[4]/div[2]/div[4]/div[2]/div/div[1]/div/div/div[3]/ul/li[&9;+ i +&9;]&9; ).click()time.sleep(2)

      这里完成后是这样的。

      (鼠标没有移动)

      &xff08;四&xff09;选择章节和讲数

      但是我需要多次点击&xff0c;而且每次点击都是不同的页面&xff0c;这时候就不得不分析chapter和lesson的源码

      经过分析发现&xff0c;俩者的源码也有一定规律

      chapters?/html/body/div[4]/div[2]/div[4]/div[2]/div/div[1]/div/div/div[1]/div[1]/div/div[1]/div/div[2]/div[章节数]?lessons?/html/body/div[4]/div[2]/div[4]/div[2]/div/div[1]/div/div/div[1]/div[1]/div/div[2]/div/div[2]/div[讲数]

      注意&xff0c;这里俩个栏的元素是隐藏的。

      可以通过js来先显示它

      js="document.getElementsByClassName(&9;down f-bg j-list&9;)[0].style.display=&9;block&9;"driver.execute_script(js)

      回到python编辑器&xff0c;可以打上这样的代码(三个for嵌套)

      全局变量区域cha=&9;/html/body/div[4]/div[2]/div[4]/div[2]/div/div[1]/div/div/div[1]/div[1]/div/div[1]/div/div[2]/div&9;chapters=[&9;1&9;,&9;2&9;,&9;3&9;,&9;4&9;,&9;5&9;,&9;6&9;,&9;7&9;,&9;8&9;,&9;9&9;,&9;10&9;,&9;11&9;,&9;12&9;,&9;13&9;,&9;14&9;]?les=&9;/html/body/div[4]/div[2]/div[4]/div[2]/div/div[1]/div/div/div[1]/div[1]/div/div[2]/div/div[2]/div&9;lessons=[&9;1&9;,&9;2&9;,&9;3&9;,&9;4&9;,&9;5&9;,&9;6&9;,]?疯狂点击点击chapter后点击lesson 然后点击视频和文档for c in chapters:time.sleep(1)js="document.getElementsByClassName(&9;down f-bg j-list&9;)[0].style.display=&9;block&9;"driver.execute_script(js)driver.find_element(By.XPATH,cha+&9;[&9;+c+&9;]&9;).click()time.sleep(1)for l in lessons:try:time.sleep(1)js2="document.getElementsByClassName(&9;down f-bg j-list&9;)[1].style.display=&9;block&9;"driver.execute_script(js2)driver.find_element(By.XPATH,les+&9;[&9;+l+&9;]&9;).click()time.sleep(1)except:breakfor i in lists:try:time.sleep(1)driver.find_element(By.XPATH,&9;/html/body/div[4]/div[2]/div[4]/div[2]/div/div[1]/div/div/div[3]/ul/li[&9;+ i +&9;]&9; ).click()time.sleep(1)except:break

      大功告成。

      (实现了不同章节不同讲的切换)

      前后进度对比

      四、源代码

      引用库from selenium import webdriverfrom selenium.webdriver.common.keys import Keysfrom selenium.webdriver.common.by import Byimport time??全局变量区域url = "https://www.icourse163.org/"driver = webdriver.Chrome()account = &9;@163.com&9;password = &9;&9;?lists=[&9;1&9;,&9;2&9;,&9;3&9;,&9;4&9;,&9;5&9;,&9;6&9;,&9;7&9;,&9;8&9;,&9;9&9;,&9;10&9;,]?cha=&9;/html/body/div[4]/div[2]/div[4]/div[2]/div/div[1]/div/div/div[1]/div[1]/div/div[1]/div/div[2]/div&9;chapters=[&9;1&9;,&9;2&9;,&9;3&9;,&9;4&9;,&9;5&9;,&9;6&9;,&9;7&9;,&9;8&9;,&9;9&9;,&9;10&9;,&9;11&9;,&9;12&9;,&9;13&9;,&9;14&9;]?les=&9;/html/body/div[4]/div[2]/div[4]/div[2]/div/div[1]/div/div/div[1]/div[1]/div/div[2]/div/div[2]/div&9;lessons=[&9;1&9;,&9;2&9;,&9;3&9;,&9;4&9;,&9;5&9;,&9;6&9;,]?打开网页driver.get(url)driver.maximize_window()?登陆部分try:driver.find_element(By.XPATH, &9;/html/body/div[4]/div[2]/div[1]/div/div/div[1]/div[3]/div[3]/div&9;).click()driver.find_element(By.XPATH, &9;/html/body/div[13]/div[2]/div/div/div/div/div[2]/span&9;).click()print(&9;点击登陆按钮成功&9;)except:print(&9;点击登陆按钮时出错&9;)??输入账号密码部分try:driver._switch_to.frame(0) 这里转到fame0 因为mooc网站点击登陆后是弹窗的driver.find_element(By.XPATH, &9;/html/body/div[2]/div[2]/div[2]/form/div/div[1]/div[2]/input&9;).send_keys(account)driver.find_element(By.XPATH, &9;/html/body/div[2]/div[2]/div[2]/form/div/div[3]/div[2]/input[2]&9;).send_keys(password)print(&9;输入账号密码成功&9;)driver.find_element(By.XPATH, &9;/html/body/div[2]/div[2]/div[2]/form/div/div[8]/a&9;).click()except:print(&9;登陆失败&9;)?time.sleep(2)点击 我的课程 按钮try:driver.switch_to.default_content()driver.find_element(By.XPATH,&9;/html/body/div[4]/div[2]/div[1]/div/div/div[1]/div[3]/div[1]/img&9;).click()print("点击头像成功")except:print("点击头像出错")?time.sleep(2)点击 高等数学&xff08;一&xff09; 课程try:driver.find_element(By.XPATH,&9;/html/body/div[4]/div[2]/div[3]/div/div[1]/div[3]/div/div[2]/div/div/div[2]/div[1]/div[2]/div/div[1]/div[1]/div[1]/a/div[1]/img&9;).click()print("点击 &9;高等数学&xff08;一&xff09;&9;成功")except:print("点击课程失败")time.sleep(2)点击继续学习try:driver.switch_to.window(driver.window_handles[-1])driver.find_element(By.XPATH,&9;/html/body/div[4]/div[2]/div[4]/div[2]/div/div[1]/div/div[1]/div/div[1]/div/a[1]&9;).click()print(&9;点击继续学习成功&9;)except:print("点击继续学习失败")??疯狂点击点击chapter后点击lesson 然后点击视频和文档for c in chapters:time.sleep(1)js="document.getElementsByClassName(&9;down f-bg j-list&9;)[0].style.display=&9;block&9;"driver.execute_script(js)driver.find_element(By.XPATH,cha+&9;[&9;+c+&9;]&9;).click()time.sleep(1)for l in lessons:try:time.sleep(1)js2="document.getElementsByClassName(&9;down f-bg j-list&9;)[1].style.display=&9;block&9;"driver.execute_script(js2)driver.find_element(By.XPATH,les+&9;[&9;+l+&9;]&9;).click()time.sleep(1)except:breakfor i in lists:try:time.sleep(1)driver.find_element(By.XPATH,&9;/html/body/div[4]/div[2]/div[4]/div[2]/div/div[1]/div/div/div[3]/ul/li[&9;+ i +&9;]&9; ).click()time.sleep(1)except:break