教你用Python实现全自动刷网课
目录
- 一、原理介绍
- 二、准备工作
- 1)安装Python3 (反正安装最新版本)
- 2)安装Chrome & ChromeDriver
- 3)在Python中安装Selenium库
- 4)编辑环境
- 三、实现
- (一)自动打开并且登陆网站
- (二)实现自动登陆
- (三)选择课程
- (四)选择章节和讲数
- 四、源代码
- 五、最后
赛季末,如何实现自动刷掉毫无意义的网课?
(双枪) 双手会给出答案
不妨自己动手用Python试一试。只想看源代码的可以直接滑到文章的最底部。
阅读前你可能需要:
1. Python基础 / 相关编程基础2. HTML 等前端方面的相关知识3. 浏览器 (本人使用的是Chrome)4. 浏览器对应版本的Driver5. Python中安装好Selenium库6. 还没刷完 且 毫无意义的网课
一、原理介绍
Python中有个名为Selenium的库,是一种知名的自动化测试库,利用它,可以实现浏览器中的点击、输入等操作,从而实现自动化刷课(或者其他合法的事情)
所以只要分析网页的源代码,就可以实现自动化操作网页。
在模拟操作的过程中,必须提前知道即将发生什么,才能完美的自动化测试。
二、准备工作
1)安装Python3 (反正安装最新版本)
官网搜索就行
(安装完后在终端自查:输入python,如图则安装完成)
2)安装Chrome & ChromeDriver
浏览器就不多说了,这里给出Driver的地址
chromedriver.storage.googleapis.com/index.html
(python安装目录script中放入对应版本的driver)
3)在Python中安装Selenium库
安装前其实要先安装pip,默认安装是有勾选的,而且这里网上有很多方法了,不多赘述。
安装好pip后可以在终端命令行中输入
pip install selenium
(安装selenium中)
(自查安装是否完成:pip show selenium)
4)编辑环境
在系统中把python的目录添加进去就行,网络上也有很多,不多赘述。
三、实现
(一)自动打开并且登陆网站
选择你要那啥的平台,这里使用mooc作为演示
获取它的URL
#引用库
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
?
#全局变量区域
url = "https://www.icourse163.org/"
driver = webdriver.Chrome()
?
?
#打开网页 最好全屏
driver.get(url)
driver.maximize_window()
运行代码就可以看见浏览器自动打开并且进入了mooc
但是由于自动化测试软件打开的浏览器没有cookie,不会识别用户
所以需要设计一下自动登陆的部分
(二)实现自动登陆
在浏览器中按F12 打开调试台 再点击这个按钮
这个是元素选择器,选择那个绿色的“登陆/注册”
之后会跳出对应的
标签,复制它的FULL XPath
(确定元素位置有很多种方式,xpath是相对准确的一种,确定元素位置相当于告诉电脑你该在哪里进行操作)
(演示,gif中复制的是xpath,应该复制full xpath)
自己点击后可以发现,出来默认是扫码登陆,我们选择其他方式登陆,这里用邮箱演示。
可以声明一下变量(#在python中是注释符)
#全局变量区域
url = "https://www.icourse163.org/"
driver = webdriver.Chrome()
account = '***@163.com' #改成自己的账户
password = '**********' #改成自己的密码
刚刚复制的xpath在这里 (这里其实复制的是full xpath,mooc对xpath有随机数的id,每次打开都不一样,所以用full xpath)
/html/body/div[4]/div[2]/div[1]/div/div/div[1]/div[3]/div[3]/div
重复上述操作找到各个按钮的xpath,在代码中添加几个点击的动作
为了方便调试,大多数操作采用try-expcet语句
(但是前期敲代码的时候,建议先不要用try-except语句,因为编译器报错的信息更有用)
mooc网点击登陆后,会弹出新的小页面,由于weddriver每次只能识别一个页面,这里直接.switch_to_frame()
#登陆部分
try:driver.find_element(By.XPATH, '/html/body/div[4]/div[2]/div[1]/div/div/div[1]/div[3]/div[3]/div').click()driver.find_element(By.XPATH, '/html/body/div[13]/div[2]/div/div/div/div/div[2]/span').click()print('点击登陆按钮成功
')
except:print('点击登陆按钮时出错')
?
?
#输入账号密码部分
try:driver._switch_to.frame(0) #这里转到fame0 因为mooc网站点击登陆后是弹窗的driver.find_element(By.XPATH, '/html/body/div[2]/div[2]/div[2]/form/div/div[1]/div[2]/input').send_keys(account)driver.find_element(By.XPATH, '/html/body/div[2]/div[2]/div[2]/form/div/div[3]/div[2]/input[2]').send_keys(password)print('输入账号密码成功
')driver.find_element(By.XPATH, '/html/body/div[2]/div[2]/div[2]/form/div/div[8]/a').click()
except:print('登陆失败')
上述代码中,总体来说,为了便于理解,是这样一个伪代码
driver.查找元素的方法('元素的位置').操作()
find_element(By.XPATH,'xpath的内容')就是通过xpath来确定元素位置
.click()就是点击的操作, .send_keys(参数)就是输入的操作
这一步完成后应该是这样的效果(登陆次数非常多的时候,可能会有滑动验证)
(三)选择课程
如果上述操作都能够掌握,后面的其实就只是重复步骤而已,教程其实可以到这里就结束了。
如果还想继续看,请往下滑。
接下来是点击头像进入课程界面,选择课程。
注意:这时候webdriver聚焦在刚刚的frame上,先改回主页面,然后点击头像就可以进入“我的课程”界面
try:driver.switch_to.default_content()driver.find_element(By.XPATH,'/html/body/div[4]/div[2]/div[1]/div/div/div[1]/div[3]/div[1]/img').click()print("点击头像成功
")
except:print("点击头像出错")
接下来这里用 “高等数学(一)” 作为演示
继续获取元素的XPATH,重复操作即可
time.sleep(2)
#点击 高等数学(一) 课程
try:driver.find_element(By.XPATH,'/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').click()print("点击 '高等数学(一)'成功")
except:print("点击课程失败")
time.sleep(4)
#点击继续学习
try:driver.switch_to.window(driver.window_handles[-1])driver.find_element(By.XPATH,'/html/body/div[4]/div[2]/div[4]/div[2]/div/div[1]/div/div[1]/div/div[1]/div/a[1]').click()print('点击继续学习成功')
except:print("点击继续学习失败")
由于mooc网有自动播放功能,但是没有自动看课件的功能,这里演示观看每节课的课件
PS:其他网课网站(智慧树)有一些是没有自动播放的,非常反人类,这时候就可以运用上面的方法实现自动播放。
分析网页源代码发现,一套课程分为chapter和lesson俩个部分
(红蓝箭头一一对应)
在lesson的每一节中都有下面的几个
- 标签
分析这一行格子的源代码可以发现
在当前的界面中,li标签中的class属性中多了个current
然后各个li标签的full xpath是有一定规律的
(可以看见后缀是递增的)
上面说了,这里只演示全部看完课件,核心方法掌握了,就可以触类旁通了。
后来发现,classname似乎锁定不到这个元素,只能暴力破解了。(有好方法的请联系我)
一行最多不过10个格子
归纳出来是这样的
/html/body/div[4]/div[2]/...(省略)/ul/li[数字]
所以可以通过只改变后面[数字]就行,每次都点击一下,先在全局变量中利用列表存储一下’[数字]’。
#全局变量区域
lists=['1','2','3','4','5','6','7','8','9','10',]
用for循环遍历列表(其实这里已经可以实现自动播放了,只要设置好第二个tiem.sleep()的参数就行)
for i in lists:time.sleep(2)driver.find_element(By.XPATH,'/html/body/div[4]/div[2]/div[4]/div[2]/div/div[1]/div/div/div[3]/ul/li['+ i +']' ).click()time.sleep(2)
这里完成后是这样的。
(鼠标没有移动)
(四)选择章节和讲数
但是我需要多次点击,而且每次点击都是不同的页面,这时候就不得不分析chapter和lesson的源码
经过分析发现,俩者的源码也有一定规律
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[讲数]
注意,这里俩个栏的元素是隐藏的。
可以通过js来先显示它
js="document.getElementsByClassName('down f-bg j-list')[0].style.display='block'"
driver.execute_script(js)
回到python编辑器,可以打上这样的代码(三个for嵌套)
#全局变量区域
cha='/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'
chapters=['1','2','3','4','5','6','7','8','9','10','11','12','13','14']
?
les='/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'
lessons=['1','2','3','4','5','6',]
?
#疯狂点击
#点击chapter后点击lesson 然后点击视频和文档
for c in chapters:time.sleep(1)js="document.getElementsByClassName('down f-bg j-list')[0].style.display='block'"driver.execute_script(js)driver.find_element(By.XPATH,cha+'['+c+']').click()time.sleep(1)for l in lessons:try:time.sleep(1)js2="document.getElementsByClassName('down f-bg j-list')[1].style.display='block'"driver.execute_script(js2)driver.find_element(By.XPATH,les+'['+l+']').click()time.sleep(1)except:breakfor i in lists:try:time.sleep(1)driver.find_element(By.XPATH,'/html/body/div[4]/div[2]/div[4]/div[2]/div/div[1]/div/div/div[3]/ul/li['+ i +']' ).click()time.sleep(1)except:break
大功告成。
(实现了不同章节不同讲的切换)
前后进度对比
四、源代码
#引用库
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import time
?
?
#全局变量区域
url = "https://www.icourse163.org/"
driver = webdriver.Chrome()
account = '********@163.com'
password = '********'
?
lists=['1','2','3','4','5','6','7','8','9','10',]
?
cha='/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'
chapters=['1','2','3','4','5','6','7','8','9','10','11','12','13','14']
?
les='/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'
lessons=['1','2','3','4','5','6',]
?
#打开网页
driver.get(url)
driver.maximize_window()
?
#登陆部分
try:driver.find_element(By.XPATH, '/html/body/div[4]/div[2]/div[1]/div/div/div[1]/div[3]/div[3]/div').click()driver.find_element(By.XPATH, '/html/body/div[13]/div[2]/div/div/div/div/div[2]/span').click()print('点击登陆按钮成功
')
except:print('点击登陆按钮时出错')
?
?
#输入账号密码部分
try:driver._switch_to.frame(0) #这里转到fame0 因为mooc网站点击登陆后是弹窗的driver.find_element(By.XPATH, '/html/body/div[2]/div[2]/div[2]/form/div/div[1]/div[2]/input').send_keys(account)driver.find_element(By.XPATH, '/html/body/div[2]/div[2]/div[2]/form/div/div[3]/div[2]/input[2]').send_keys(password)print('输入账号密码成功
')driver.find_element(By.XPATH, '/html/body/div[2]/div[2]/div[2]/form/div/div[8]/a').click()
except:print('登陆失败')
?
time.sleep(2)
#点击 我的课程 按钮
try:driver.switch_to.default_content()driver.find_element(By.XPATH,'/html/body/div[4]/div[2]/div[1]/div/div/div[1]/div[3]/div[1]/img').click()print("点击头像成功
")
except:print("点击头像出错")
?
time.sleep(2)
#点击 高等数学(一) 课程
try:driver.find_element(By.XPATH,'/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').click()print("点击 '高等数学(一)'成功
")
except:print("点击课程失败")
time.sleep(2)
#点击继续学习
try:driver.switch_to.window(driver.window_handles[-1])driver.find_element(By.XPATH,'/html/body/div[4]/div[2]/div[4]/div[2]/div/div[1]/div/div[1]/div/div[1]/div/a[1]').click()print('点击继续学习成功
')
except:print("点击继续学习失败")
?
?
#疯狂点击
#点击chapter后点击lesson 然后点击视频和文档
for c in chapters:time.sleep(1)js="document.getElementsByClassName('down f-bg j-list')[0].style.display='block'"driver.execute_script(js)driver.find_element(By.XPATH,cha+'['+c+']').click()time.sleep(1)for l in lessons:try:time.sleep(1)js2="document.getElementsByClassName('down f-bg j-list')[1].style.display='block'"driver.execute_script(js2)driver.find_element(By.XPATH,les+'['+l+']').click()time.sleep(1)except:breakfor i in lists:try:time.sleep(1)driver.find_element(By.XPATH,'/html/body/div[4]/div[2]/div[4]/div[2]/div/div[1]/div/div/div[3]/ul/li['+ i +']' ).click()time.sleep(1)except:break
五、最后
感兴趣的可以关注我的微信公众号,第一时间收到动态
教你用Python实现全自动刷网课相关推荐
- 前一段时间比较火的刷网课平台源码,带数据库和教程
前一段时间比较火的刷网课平台源码,带数据库和教程. 好在疫情已经结束了,希望今后世上再无网课. 这个代码免费提供给大家学习开发用吧,作为一个php的入门学习案例用用还可以. 使用办法 网站根目录解压 ...
- 最详细新版网课联盟27刷网课平台源码+安装教程+最新模板+下载地址
新版网课联盟27刷网课平台源码+安装教程+最新模板 第一步:准备一个服务器+域名 没有域名暂时使用服务器网址也可以 第二步:上传文件 上传文件到wwwroot上面,进行解压 第三步:进行防伪静态设置: ...
- python体验课是上纯代码_大陈教初中生学Python,入门体验第二课教学设计,溯本追源...
第一课我们已经对Python有了一定的了解,那么接下来再通过补充程序.改正程序.编写程序,和学生一起明确变量.常量.表达式.数据类型.赋值语句.输入输出语句.数据类型转换函数.算术运算符等基础知识,溯 ...
- 零基础学python比较好的网课-请问自学 Python 有必要买课程吗?
关于学习python,本仙女有话要说 勤奋自律+觉悟5星,建议自学,如果有一个上进心但缺少自律性,对自己信心不足或觉得自己不够聪明,可以选择培训班: 题主说的是自学,那我就聊一下自学python,众所 ...
- 利用代码实现自动刷网课阅读时长功能 JAVA
目录 前言: 理论依据: 现实依据: 朴素版只能循环阅读不能翻页: 升级版 翻页 + 阅读: 如何使用: 前言: 最近不也快结课了,网课该刷的都要刷掉,最近不就把一门思政课刷完了,课后习题也做了,但是 ...
- 基于Python的(拍照签到+网课在线检测)深度学习的人脸识别系统
摘 要 近年来,网络技术日新月异,我们已经进入了大数据的时代并成为其中第一员,由此带来数据量的飞跃式的增长,而如何利用这些数据产生实际的生产价值则成为了大数据时代的一个重要问题.而人脸识别技术是一份对 ...
- python全自动模拟_数十行 Python 代码全自动刷王者荣耀金币
王者荣耀的冒险模式里有个挑战模式,第一次过关可以获得比较多的金币,后面重新挑战还是会获得少量金币,这不算是bug,你不嫌烦手动蛮力也可以刷金币. 此关卡使用纯输出英雄20秒左右可以打BOSS,50秒左 ...
- 手把手教你写Python网络爬虫:网易云音乐歌单
介绍 什么是爬虫? 先看看百度百科的定义: 网络爬虫 简单的说网络爬虫(Web crawler)也叫做网络铲(Web scraper).网络蜘蛛(Web spider),其行为一般是先"爬& ...
- 手把手教你用Python网络爬虫获取网易云音乐歌曲
前天给大家分享了用Python网络爬虫爬取了网易云歌词,在文尾说要爬取网易云歌曲,今天小编带大家一起来利用Python爬取网易云音乐,分分钟将网站上的音乐down到本地. 跟着小编运行过代码的筒子们将 ...
- 【Python】手把手教你用Python爬取某网小说数据,并进行可视化分析
网络文学是以互联网为展示平台和传播媒介,借助相关互联网手段来表现文学作品及含有一部分文字作品的网络技术产品,在当前成为一种新兴的文学现象,并快速兴起,各种网络小说也是层出不穷,今天我们使用seleni ...
最新文章
- 《OpenCV3编程入门》学习笔记6 图像处理(三)形态学滤波(1):腐蚀与膨胀
- swift string,Int,Double相互转换
- 康奈尔大学对博士生的四点要求
- 【面试】足够应付面试的Spring事务源码阅读梳理(建议珍藏)
- ADO读取EXCEL
- 关联查询的resultMap写法示例
- strcmp()字符串比较函数
- leetcode —— 45. 跳跃游戏 II
- 消息中间件的技术选型心得-RabbitMQ ActiveMQ和ZeroMQ
- 使用 docker 创建自己的镜像
- 米斯特白帽培训讲义 漏洞篇 文件包含
- 每日Ubuntu小技巧——在Ubuntu中使用音乐软件“声破天”Spotify
- CentOS 6.5使用本地光盘做yum源
- 精度计算——大数阶乘
- 移动物联卡资费标准是如何的
- spring cloud 学习笔记(1)
- 2015 年 5 月软考网络工程师真题与参考答案
- 破解WEP无线网络WLAN全攻略
- 浏览器 - 监听浏览器刷新及关闭
- 动图gif怎么制作?制作方法你学会了吗?