一.整体概述
最近迷上了python自动化,再加上我学习通还有选修课程没有刷,突发奇想看能不能写一个自动化刷课的python程序。虽然面临被检测的风险,但程序整个制作过程还是收获满满的。
学习通在每节课播放结束后并不会自动播放下一节课,所以这个自动化实现了自动点击下一节课的功能。
基本思路是这样的,自动登录(图形验证码需要借助opencv库,学了之后再更新代码);爬取课程时长以控制自动化操作;模拟鼠标,在每节课结束后自动播放下一节课。这样就可在教室上课时,宿舍电脑挂机刷课了。
整个过程需要用到selenium库和pyautogui库。selenium可以定位html标签元素,可以爬取网页信息,和实现一些鼠标和键盘输入的自动化操作。pyautogui库是也是操控键盘和鼠标的库。你或许会问这不和selenium的功能重复了吗。主要是本博主才疏学浅,学习通用了js动态添加的功能,我没找到办法用selenium定位这种源代码里面没有的标签,所以我借助了pyautogui库里面通过位置操控鼠标的功能,而不是定位标签元素去点击。
二.实现过程
2.1 selenium库创建一个浏览器的对象
** ** 开始之前需要做点准备工作
** ** 1.安装selenium库和pyautogui库,这就不过多说明了,可以在pycharm里面操作。
2.使用selenium操控浏览器的时候需要下载对应的**浏览器驱动**。先去浏览器设置里面找到浏览器的版本,然后去WebDriver官网下载对应的浏览器驱动。下载后要记住放置文件夹的绝对地址,或者下载在工作目录下使用相对地址,接着便可以开始下一步操作了。
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
# 初始化浏览器的对象
service = Service('./chromedriver.exe')
options = webdriver.ChromeOptions()
browser = webdriver.Chrome(service=service, options=options)
2.2 实现登录过程
1.首先获得课程url,这个根据自己需求,去自己获取。
2.我这里最大化了浏览器窗口,这是为了后续控制鼠标的方便;如果使用小的窗口,会导致页面元素展示的很拥挤,鼠标可能定位的不准确。
3.借助find_element()函数定位输入框,send_keys()函数传入字符串,最后定位登录按钮并点击实现进入学习通的功能。
4.browser.implicitly_wait(3)这个函数可以实现隐式等待,设置全局查找时间3秒,意思是超过3秒没有定位到一个元素,就会报异常,期间会一直轮询查找元素。
![](https://img-blog.csdnimg.cn/direct/1b7b5e63365243f8a255554cdd3d9ecf.png)
![](https://img-blog.csdnimg.cn/direct/7e6a80670133428589a5ae5ab58ab4f4.png)
![](https://img-blog.csdnimg.cn/direct/5ec70825679d46d590d0f4ffcc73aa25.png)
![](https://img-blog.csdnimg.cn/direct/506a1dc8a7914c5ca140a434674c4210.png)
browser.get('url')
# 最大化窗口
browser.maximize_window()
# ========== 登录功能 ==========
# 1.输入账号密码
browser.find_element(By.ID, 'phone').send_keys('phone')
browser.find_element(By.ID, 'pwd').send_keys('pwd')
browser.find_element(By.ID, 'loginBtn').click()
# 等待页面加载
browser.implicitly_wait(3)
2.3实现自动点击下一节课
1.这里本来是准备爬取到每节课的时长,但是学习通采用了js动态添加和iframe标签内嵌网页反爬。iframe标签内嵌可以用switch_to.iframe()处理;js标签需要去DevTools里面查看。
![](https://img-blog.csdnimg.cn/direct/d601aef699ac4692877406e0f93ca4d4.png)
这里确实找到了视频的时长,因此我去观察请求网址,想找到规律自造网址去爬到时长:https://mooc1.chaoxing.com/ananas/video-editor/sub?objectid=4fcd2c59c84679de42674db7242d5650
https://mooc1.chaoxing.com/ananas/video-editor/sub?objectid=5558383fc895ac5e1b9b3a4295b8d87d
两个网址确实有规律可循,都是get请求,在后面拼接了objectid=‘xxx’,所以我去专门查看了objectid
4fcd2c59c84679de42674db7242d5650
4fcd2c59c84679de42674db7242d5650
6357a52a95f73e75fe4eb5646d3e84bd
显然是无迹可寻......
所以采用下下策,列表中自己输入每节课的时长向上取整,得到了time_list[]
2.接下来就是pyautogui库的高光时刻了,通过mouse_pos = pyautogui.position(),获得鼠标在屏幕的像素点位置,在通过pyautogui.moveTo(x, y, duration=0.5)移动鼠标的位置,在通过pyautogui.click()实现鼠标点击,即可完成自动播放下一集的功能。
需要注意两个章节之间是有一个章节提示,这并不是下一节课的按钮,需要跳过,所以每层内循环结束后y+=50
![](https://img-blog.csdnimg.cn/direct/6a3fb9a6d6f841c7ac19346a8ef81026.png)
# ========== 自动点击下一节课 ==========
# 这里以两章为例
# 每节课的视频时长
time_list = [[18, 12, 16, 12, 18, 15, 23],
[11, 7, 22, 15, 26, 13, 15, 13]]
# 第一节课按钮的位置
x = 1474
y = 450
for i in range(len(time_list)):
for j in range(len(time_list[i])):
# 每节课的位置
pyautogui.moveTo(x, y, duration=0.5)
pyautogui.click()
# 点击播放器
sleep(3)
# 播放器的位置 x=692, y=780
pyautogui.moveTo(692, 780, duration=0.3)
pyautogui.click()
# 等视频播放完
sleep(time_list[i][j] * 60)
# 下一节课位置的更新
y += 50
y += 50
三.结束语
1.整个程序的制作过程有很多的残缺,例如还没有解决自动爬取课程时长的问题;也没有办法定位源代码没有的元素,像js动态添加;依然是以py文件展现的,没有打包成exe的脚本文件。
2.这个程序依然没有实现完全的自动化,而且十分的简陋,是我突发奇想的第一次自动化程序。在接下来的时间里,我会继续学习,不断完善这个程序,谢谢喜欢。
版权归原作者 樱花9912 所有, 如有侵权,请联系我们删除。