下面界面的网址是:
1.1点击选择单位按钮,会出现各省份和个学校的列表
1.2.右击你所在的省份,点击检查(这里以河南的洛阳理工为例),右侧光标会定位在你所在省份的标签列,
1.3.右击标签–>copy—>copy xpath
1.4.把copy之后的代码复制到从github下载下来的第十四行代码中,即
# 点击河南
henan = driver.find_element_by_xpath('要复制的地方')
henan.click()
1.5.选择学校,点击左侧列表中的河南,在右侧找到你所在的学校,右击学校点击检查
1.6.在右侧会光标会显示在你所在学校的标签中,右击—>copy–>copy xpath
1.7把复制的代码粘贴到从github下载下来的第22行
# 点击洛阳理工
louyang = driver.find_element_by_xpath('要复制的地方')
louyang.click()
1.8接下来还要修改的代码部分是你要刷的那个慕课的网址,请确保是下面这个图中的url链接
1.9把整个url复制下来之后要替换的是从github下载下来的代码中的第45行代码,把url复制到下面要替换的位置
# 得到慕课网址
get_url = '要替换的地方网址'
driver.get(get_url)
time.sleep(5)
2.接下来就是运行程序,输入自己的账号密码和网页中的验证码。程序就可以跑起来了,就可以实现物理外挂来刷课。
3.接下来就是重点,程序实现的原理。首先获取一共有多少个章节,遍历章节,处理网络不稳定,换公网,点击播放按钮,处理答题细节,处理打完题的情况。
3.0 播放器的html代码是在页面下面的ifram中的ifram中的hml代码里面要使用driver的switch_to.frame方法来切换到ifram中去。
# 切换到下面的iframe里
try:
driver.switch_to.frame(driver.find_element_by_xpath('//body/div/div/p/div/iframe'))
except:
driver.switch_to.frame(driver.find_element_by_xpath('//body/div/div/p/span/div/iframe'))
3.1找到所有的章节标签遍历。
所有的章节都在//*[@id=“coursetree”]/div里面,使用driver的find_elements_by_xpath方法来找到所有标签,获取标签数量,并遍历
3.1从html代码中发现每一个大章节的第一个标签和其他标签不一样,第一章节是在//[@id=“coursetree”]/div/div中,而下面的章节是在//[@id=“coursetree”]/div中比第一章节少了一个div。可以使用try-except语句来处理先获取点击第一章节或第二章节的标签,出现异常再点击另一个按钮,这个方法可以完美的处理遍历章节中使每一个都可以遍历到
下面是处理的代码
# 点击章节
try:
driver.find_element_by_xpath('//*[@id="coursetree"]/div[' + str(i + 1) + ']').click()
except:
driver.find_element_by_xpath('//*[@id="coursetree"]/div[' + str(i + 1) + ']/div').click()
3.2点击播放按钮,播放按钮到目前位置发现有两种一种是直接在视频框里面的,另一种要先点击视频切换到视频框,在点击播放按钮。
# 找到播放按钮并点击
try:
button = driver.find_element_by_xpath('//*[@id="reader"]')
button.click()
except:
driver.find_element_by_xpath('//*[@id="dct2"]').click()
driver.find_element_by_xpath('//*[@id="reader"]').click()
3.3处理网络问题,有时候使用本校的网是不行的,会出现网络不佳的问题,所有要使用代码来直接切换到公网按钮,使用代码先点击本校按钮,再点击公网2按钮(直接点击公网2按钮是不行的,实验过了,这些点击的按钮的位置都是通过find_element_by_xpath来获取的,和上面方法一样不在多说。)
# 找到公网
try:
driver.find_element_by_xpath('//*[@id="video"]/div[4]/div[8]/span').click()
driver.find_element_by_xpath('//*[@id="video"]/div[4]/div[8]/div/ul/li[3]/span[1]').click()
except:
pass
3.4像找到快进按钮啊,静音按钮都是一个办法的。通过find_element_by_xpath方法得到并点击。
4.下面处理答题,完成视频,和网络不佳的情况。这些逻辑但是在try-except里面处理的
4.1出现网络不佳时,使用右击—>检查---->右击copy---->copy xpath来获取公网2的标签位置并点击。
# 当网络不可用时 点击公网
try:
driver.find_element_by_xpath('//*[@id="vjserrdisplay-1035"]/ul/li[2]/label').click()
except:
pass
4.2出现答题时找到,视频中答题位置,找到选择题选项位置,遍历每一个选项点击,总有一个是正确的(而且这个答案是不影响总成绩的)
-代码实现
# 找到视频中出现的答题位置
if driver.find_element_by_xpath('//body/div[4]/div/div[7]/span/div/div'):
# 找到选择题
button3 = driver.find_elements_by_xpath('//body/div[4]/div/div[7]/span/div/div/ul/li')
# print("button3{}", button3)
while driver.find_element_by_xpath('//body/div[4]/div/div[7]/span/div/div'):
# print(1)
# 对选项进行遍历
for button1 in button3:
button1 = button1.find_element_by_xpath('label')
# print("button1{}", button1)
button1.click()
time.sleep(random.random() * 3)
# 点击提交按钮
button5 = driver.find_element_by_xpath('//body/div[4]/div/div[7]/span/div/div/div[2]')
# print("button5{}", button5)
button5.click()
time.sleep(random.random() * 3)
if driver.switch_to.alert():
al = driver.switch_to.alert()
al.accept()
time.sleep(random.random())
if not driver.find_element_by_xpath('//body/div[4]/div/div[7]/span/div/div'):
# print("答题完成")
break
except Exception as e:
# print("未找到答题位置")
time.sleep(random.random() * 3)
4.3判断视频是否看完,找到播放标签,如果播放标签的文本是‘重播’那么证明这个视频已经完成。跳出循环就好。
try:
# 找到重播按钮
rename = driver.find_element_by_xpath('//*[@id="video"]/div[4]/button[1]').get_attribute('title')
if rename == '重播':
break
except Exception as e:
time.sleep(random.random() * 3)
5返回上一层ifram的上一层ifram继续下一层 循环。
-暂时不会判断视频是否播放过。