赞
踩
最近迷上了python自动化,再加上我学习通还有选修课程没有刷,突发奇想看能不能写一个自动化刷课的python程序。虽然面临被检测的风险,但程序整个制作过程还是收获满满的。
学习通在每节课播放结束后并不会自动播放下一节课,所以这个自动化实现了自动点击下一节课的功能。
基本思路是这样的,自动登录(图形验证码需要借助opencv库,学了之后再更新代码);爬取课程时长以控制自动化操作;模拟鼠标,在每节课结束后自动播放下一节课。这样就可在教室上课时,宿舍电脑挂机刷课了。
整个过程需要用到selenium库和pyautogui库。selenium可以定位html标签元素,可以爬取网页信息,和实现一些鼠标和键盘输入的自动化操作。pyautogui库是也是操控键盘和鼠标的库。你或许会问这不和selenium的功能重复了吗。主要是本博主才疏学浅,学习通用了js动态添加的功能,我没找到办法用selenium定位这种源代码里面没有的标签,所以我借助了pyautogui库里面通过位置操控鼠标的功能,而不是定位标签元素去点击。
开始之前需要做点准备工作
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)
1.首先获得课程url,这个根据自己需求,去自己获取。
2.我这里最大化了浏览器窗口,这是为了后续控制鼠标的方便;如果使用小的窗口,会导致页面元素展示的很拥挤,鼠标可能定位的不准确。
3.借助find_element()函数定位输入框,send_keys()函数传入字符串,最后定位登录按钮并点击实现进入学习通的功能。
4.browser.implicitly_wait(3)这个函数可以实现隐式等待,设置全局查找时间3秒,意思是超过3秒没有定位到一个元素,就会报异常,期间会一直轮询查找元素。
- 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)
1.这里本来是准备爬取到每节课的时长,但是学习通采用了js动态添加和iframe标签内嵌网页反爬。iframe标签内嵌可以用switch_to.iframe()处理;js标签需要去DevTools里面查看。
这里确实找到了视频的时长,因此我去观察请求网址,想找到规律自造网址去爬到时长: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
- # ========== 自动点击下一节课 ==========
- # 这里以两章为例
- # 每节课的视频时长
- 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.这个程序依然没有实现完全的自动化,而且十分的简陋,是我突发奇想的第一次自动化程序。在接下来的时间里,我会继续学习,不断完善这个程序,谢谢喜欢。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。