selenium和pyautogui实现简单的学习通自动化刷课

一.整体概述

        最近迷上了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秒没有定位到一个元素,就会报异常,期间会一直轮询查找元素。

                                 

                

                

                

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://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.这个程序依然没有实现完全的自动化,而且十分的简陋,是我突发奇想的第一次自动化程序。在接下来的时间里,我会继续学习,不断完善这个程序,谢谢喜欢。

  • 30
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值