简单的自动化使用--使用selenium实现学习通网站的刷慕课程序。注释空格加代码大概200行不到

简单的自动化使用--使用selenium实现学习通网站的刷慕课程序。注释空格加代码大概200行不到

相见恨晚啊

github地址

环境Python3.6 + pycharm + chrom浏览器 + chromdriver

依赖库selenium,time,random

  • selenium实现自动化控制浏览器
  • time和random设置随机的停留时间,使程序更像是人类在控制。

基本思想:使用Python中的selenium库来控制chrom浏览器来刷慕课,并且是模拟人类点击物理,至关于物理外挂。

1.实现模拟登陆,选择省份,学校,输入帐号,密码,以及验证码。

  • 使用selenium库来定义一个chrom实例driver。
  • 使用driver来进入登陆网址
  • 使用driver的findelementby_xpath方法来选取省份,学校(这个因我的而不一样的,程序里面是须要更改的。

下面界面的网址是:html

1.1点击选择单位按钮,会出现各省份和个学校的列表git

在这里插入图片描述

1.2.右击你所在的省份,点击检查(这里以河南的洛阳理工为例),右侧光标会定位在你所在省份的标签列,github

在这里插入图片描述

 

 

1.3.右击标签-->copy--->copy xpath 浏览器

在这里插入图片描述

 

在这里插入图片描述

1.4.把copy以后的代码复制到从github下载下来的第十四行代码中,即网络

  1. # 点击河南
  2. henan = driver.find_element_by_xpath('要复制的地方')
  3. henan.click()

 

1.5.选择学校,点击左侧列表中的河南,在右侧找到你所在的学校,右击学校点击检查dom

在这里插入图片描述

1.6.在右侧会光标会显示在你所在学校的标签中,右击--->copy-->copy xpathide

在这里插入图片描述

1.7把复制的代码粘贴到从github下载下来的第22行学习

  1. # 点击洛阳理工
  2. louyang = driver.find_element_by_xpath('要复制的地方')
  3. louyang.click()

1.8接下来还要修改的代码部分是你要刷的那个慕课的网址,请确保是下面这个图中的url连接网站

在这里插入图片描述

 

1.9把整个url复制下来以后要替换的是从github下载下来的代码中的第45行代码,把url复制到下面要替换的位置url

  1. # 获得慕课网址
  2. get_url = '要替换的地方网址'
  3. driver.get(get_url)
  4. time.sleep(5)

 

2.接下来就是运行程序,输入本身的帐号密码和网页中的验证码。程序就能够跑起来了,就能够实现物理外挂来刷课。

在这里插入图片描述

 

若是只是想使用这个程序的话,上面的就已经够用了。下载github代码,修改省份,学校,和慕课网址运行程序就能够开启物理外挂来刷慕课了。若是想和我一块儿来维护这个程序的话,能够看下面的讲解,进一步了解这一程序的运行原理。

3.接下来就是重点,程序实现的原理。首先获取一共有多少个章节,遍历章节,处理网络不稳定,换公网,点击播放按钮,处理答题细节,处理打完题的状况。

3.0 播放器的html代码是在页面下面的ifram中的ifram中的hml代码里面要使用driver的switch_to.frame方法来切换到ifram中去。

  • 代码处理
  1. # 切换到下面的iframe里
  2. try:
  3. driver.switch_to.frame(driver.find_element_by_xpath('//body/div/div/p/div/iframe'))
  4. except:
  5. driver.switch_to.frame(driver.find_element_by_xpath('//body/div/div/p/span/div/iframe'))

3.1找到全部的章节标签遍历。

  • 全部的章节都在//*[@id="coursetree"]/div里面,使用driver的findelementsby_xpath方法来找到全部标签,获取标签数量,并遍历

  • 在这里插入图片描述

  • 在这里插入图片描述

  • 3.1从html代码中发现每个大章节的第一个标签和其余标签不同,第一章节是在//[@id="coursetree"]/div/div中,而下面的章节是在//[@id="coursetree"]/div中比第一章节少了一个div。能够使用try-except语句来处理先获取点击第一章节或第二章节的标签,出现异常再点击另外一个按钮,这个方法能够完美的处理遍历章节中使每个均可以遍历到

  • 下面是章节不同的图 在这里插入图片描述

  • 下面是处理的代码

  1. # 点击章节
  2. try:
  3. driver.find_element_by_xpath('//*[@id="coursetree"]/div[' + str(i + 1) + ']').click()
  4. except:
  5. driver.find_element_by_xpath('//*[@id="coursetree"]/div[' + str(i + 1) + ']/div').click()

3.2点击播放按钮,播放按钮到目前位置发现有两种一种是直接在视频框里面的,另外一种要先点击视频切换到视频框,在点击播放按钮。

  • 下面是第一种状况直接就能够点击播放按钮
  •  在这里插入图片描述
  • 下面是第二种状况,要先点视频,再点击播放按钮
  •  在这里插入图片描述
  • 下面是处理这两种状况的处理逻辑
  1. # 找到播放按钮并点击
  2. try:
  3. button = driver.find_element_by_xpath('//*[@id="reader"]')
  4. button.click()
  5. except:
  6. driver.find_element_by_xpath('//*[@id="dct2"]').click()
  7. driver.find_element_by_xpath('//*[@id="reader"]').click()

3.3处理网络问题,有时候使用本校的网是不行的,会出现网络不佳的问题,全部要使用代码来直接切换到公网按钮,使用代码先点击本校按钮,再点击公网2按钮(直接点击公网2按钮是不行的,实验过了,这些点击的按钮的位置都是经过findelementby_xpath来获取的,和上面方法同样不在多说。)

  • 下面是实现代码
  1. # 找到公网
  2. try:
  3. driver.find_element_by_xpath('//*[@id="video"]/div[4]/div[8]/span').click()
  4. driver.find_element_by_xpath('//*[@id="video"]/div[4]/div[8]/div/ul/li[3]/span[1]').click()
  5. except:
  6. pass

3.4像找到快进按钮啊,静音按钮都是一个办法的。经过findelementby_xpath方法获得并点击。

4.下面处理答题,完成视频,和网络不佳的状况。这些逻辑可是在try-except里面处理的

4.1出现网络不佳时,使用右击--->检查---->右击copy---->copy xpath来获取公网2的标签位置并点击。

  1. # 当网络不可用时 点击公网
  2. try:
  3. driver.find_element_by_xpath('//*[@id="vjserrdisplay-1035"]/ul/li[2]/label').click()
  4. except:
  5. pass

4.2出现答题时找到,视频中答题位置,找到选择题选项位置,遍历每个选项点击,总有一个是正确的(并且这个答案是不影响总成绩的) -代码实现

  1. # 找到视频中出现的答题位置
  2. if driver.find_element_by_xpath('//body/div[4]/div/div[7]/span/div/div'):
  3. # 找到选择题
  4. button3 = driver.find_elements_by_xpath('//body/div[4]/div/div[7]/span/div/div/ul/li')
  5. # print("button3{}", button3)
  6. while driver.find_element_by_xpath('//body/div[4]/div/div[7]/span/div/div'):
  7. # print(1)
  8. # 对选项进行遍历
  9. for button1 in button3:
  10. button1 = button1.find_element_by_xpath('label')
  11. # print("button1{}", button1)
  12. button1.click()
  13. time.sleep(random.random() * 3)
  14. # 点击提交按钮
  15. button5 = driver.find_element_by_xpath('//body/div[4]/div/div[7]/span/div/div/div[2]')
  16. # print("button5{}", button5)
  17. button5.click()
  18. time.sleep(random.random() * 3)
  19. if driver.switch_to.alert():
  20. al = driver.switch_to.alert()
  21. al.accept()
  22. time.sleep(random.random())
  23. if not driver.find_element_by_xpath('//body/div[4]/div/div[7]/span/div/div'):
  24. # print("答题完成")
  25. break
  26. except Exception as e:
  27. # print("未找到答题位置")
  28. time.sleep(random.random() * 3)

4.3判断视频是否看完,找到播放标签,若是播放标签的文本是‘重播’那么证实这个视频已经完成。跳出循环就好。

  • 代码实现
  1. try:
  2. # 找到重播按钮
  3. rename = driver.find_element_by_xpath('//*[@id="video"]/div[4]/button[1]').get_attribute('title')
  4. if rename == '重播':
  5. break
  6. except Exception as e:
  7. time.sleep(random.random() * 3)

5返回上一层ifram的上一层ifram继续下一层 循环。

代码的不足之处:

-暂时不会判断视频是否播放过。

  • 有一条输出语句中时间标签获取不出来。
  • 播放时必须有一台电脑在运行程序,并且鼠标从页面出去,或者不进入到页面中,否则会形成暂停异常。(若是你有一台云主机的话,那就完美了)

运行结果:部分截图

在这里插入图片描述

若是有不会之处,或有代码异常,运行错误等,请联系下面公众号,你的反馈会使代码更加健壮。

在这里插入图片描述

相关文章
相关标签/搜索