Python+Selenium视频自动播放
tip:本脚本只是为了过一遍视频时长完成任务点,不需要手动点击视频播放,建议放完之后2倍速好好学习
安装Python
Python官网下载:Python
建议最好自定义安装位置,默认位置不好找。
安装Selenium库
windows+r 打开cmd窗口:输入 pip install selenium
若Python安装成功:selenium安装失败的可能原因:pip版本不匹配,升级pip:python -m pip install --upgrade pip
若selenium安装成功,脚本运行错误,可能原因:selenium版本不匹配,需要进行selenium升级与安装。
检查Python是否安装成功:cmd窗口输入python,会显示python版本号,quit()或ctrl+z 回车退出python
安装浏览器驱动
根据使用的浏览器进行下载,下载完成后,解压压缩包,将geckodriver.exe放入安装好的Python的Scripts文件夹下。
脚本代码
根据课程不同进行适应性修改
import time
from selenium import webdriver # 导入库
from selenium.webdriver.common.action_chains import ActionChains
#我使用的FireFox 使用Chrome将Firefox换成Chrome
browser = webdriver.Firefox(executable_path="") # 双引号内添加下载好的浏览器驱动的地址 D:/Python/Scripts/geckodriver.exe
url = "http://i.chaoxing.com/vLoginPage" #学习通登录地址
browser.get(url)
mycourse=""
mychapter=""
flag=0 #有些课程章节任务点设置不同 使用flag限制
English="大学英语A(4)"
Discrete="离散数学"
Mao=""#填入对应课程
def init():
code=input("请输入选择的课程代号(0:英语;1:离散数学;2:Mao):")#根据自己课程进行修改
global mycourse
global mychapter
global flag
mychapter=input("请输入选择的章节(1.1):")
if code == "1":
mycourse = Discrete#根据自己课程进行修改
flag=3
elif code == "2":
mycourse = Mao#根据自己课程进行修改
flag=3
else:
mycourse = English#根据自己课程进行修改
print(mycourse)
print(mychapter)
def input_usename_and_password():
li=browser.find_element_by_xpath("//li[contains(text(),'手机号/超星号登录')]")
ActionChains(browser).move_to_element(li).click().perform()#切换登录框
inp=input("请输入账号:")
inp_2=input("请输入密码:")
#inp_3=input("请输入验证码:")
#inp="" #双引号中填入账号 不需要每次交互输入
#inp_2="" #双引号中填入密码
#inp_3=""
username = browser.find_element_by_id("uin_tips")
password = browser.find_element_by_id("pwd_tips")
#verycode = browser.find_element_by_id("numcode") #若有验证码就和上面一样使用 numcode改成对应html中验证框的id
ActionChains(browser).move_to_element(username).click().perform()
username.send_keys(inp)
ActionChains(browser).move_to_element(password).click().perform()
password.send_keys(inp_2)
#verycode.send_keys(inp_3)
sbm = browser.find_element_by_id("login")
time.sleep(1)
sbm.click()
# 进入首页,开始选择课程
def choose_course():
time.sleep(1)
#browser.implicitly_wait(3) 网速不好时使用
browser.switch_to.frame("frame_content")
#进入首页,开始选择课程
str="//a[@title='"+mycourse+"']"
#course = browser.find_element_by_xpath("//a[@title='大学英语A(4)']")
course = browser.find_element_by_xpath(str)
browser.execute_script("arguments[0].scrollIntoView({block:'center'});",course)#滑动到指定位置处
course.click()
print("进入课程")
time.sleep(1)
browser.switch_to.window(browser.window_handles[-1])
# 判断是否有通知
def is_notice():
time.sleep(1)
#browser.implicitly_wait(3)
judge = 1
while judge:
try:
cloes_widow = browser.find_element_by_xpath("/html/body/div[9]/div/a")
browser.execute_script("arguments[0].scrollIntoView();",cloes_widow)#滑动到指定位置处
cloes_widow.click()
print("有通知消息")
except:
print("没有通知消息")
judge = 0
pass
# 进入课程学习页面 选择小节
def into_start_study_window():
time.sleep(1)
#browser.implicitly_wait(3) #网络不太好是隐式等待
str="//span[contains(text(),'"+mychapter+"')]/following-sibling::span[2]//a"
vidio = browser.find_element_by_xpath(str)
#vidio=browser.find_element_by_xpath("//a[@title='Text A Part One']")
browser.execute_script("arguments[0].scrollIntoView();",vidio)#滑动到指定位置处
ActionChains(browser).move_to_element(vidio).click().perform()
vidio.click()
time.sleep(1)
#该小节任务 视频或ppt
def finish_task():
main_frame=browser.find_element_by_id("iframe")
browser.switch_to.frame(main_frame)
frames=browser.find_elements_by_class_name('ans-insertvideo-online')
count=len(frames);
if count > 0:
print("该小节视频数量:",count)
for i in range(0,count):
time.sleep(1)
browser.execute_script("arguments[0].scrollIntoView({block:'center'});",frames[i])#滑动到指定位置处
browser.switch_to.frame(frames[i])
time.sleep(0.5)
try:
vidio = browser.find_element_by_class_name("vjs-big-play-button")
vidio.click()
except:
vidio = browser.find_element_by_class_name("vjs-control-bar")
vidio.click()
try:
btn_mute=browser.find_element_by_xpath("/html/body/div[4]/div/div[4]/div[6]/button")
btn_mute.click()
except:
btn_mute=browser.find_element_by_class_name("vjs-mute-control")
btn_mute.click()
print('第{}个视频开始播放'.format(i+1))
time_tuple=is_vedio_finished(count,i+1)
while (time_tuple[0]!=time_tuple[1]):
time_tuple=is_vedio_finished(count,i+1)
print('第{}个视频播放完成'.format(i+1))
browser.switch_to.parent_frame()
print("该小节视频播放完毕")
else:
print("该小节没有视频")
try:
ppt_frame=browser.find_element_by_class_name('insertdoc-online-ppt')
except:
pass
else:
if mycourse == Discrete:
pass
else:
try:
browser.switch_to.frame(ppt_frame)
btn_next=browser.find_element_by_xpath("//*[@id='ext-gen1042' and @class='mkeRbtn']")
except:
try:
btn_next=browser.find_element_by_class_name("mkeRbtn")
except:
browser.switch_to.parent_frame()
print("无法获取PPT下一页点击按钮")
return
print("开始播放PPT")
try:
cur_page=browser.find_element_by_xpath("/html/body/div[8]/div[1]/span[1]").get_attribute("textContent")
all_page=browser.find_element_by_xpath("/html/body/div[8]/div[1]/span[2]]").get_attribute("textContent")
except:
try:
cur_page=browser.find_element_by_class_name("num")
all_page=browser.find_element_by_class_name("all")
except:
print("无法获取ppt页数")
return
while (cur_page!=all_page):
time.sleep(0.1)
try:
btn_next.click()
except:
break
try:
cur_page=browser.find_element_by_xpath("/html/body/div[8]/div[1]/span[1]").get_attribute("textContent")
except:
cur_page=browser.find_element_by_class_name("num")
print("当前PPT页数:",cur_page)
print("PPT播放完成")
browser.switch_to.parent_frame()
# 判断视频是否完成
def is_vedio_finished(allnum,curnum):
#time.sleep(1)
browser.implicitly_wait(1)
try:
vedio_stat_time = browser.find_element_by_xpath("/html/bodn/div[4]//div/div[4]/div[2]/span[2]").get_attribute(
"textContent")
vedio_end_time = browser.find_element_by_xpath("/html/body/div[4]//div/div[4]/div[4]/span[2]").get_attribute(
'textContent')
except:
try:
vedio_stat_time = browser.find_element_by_class_name("vjs-current-time-display").get_attribute(
"textContent")
vedio_end_time = browser.find_element_by_class_name("vjs-duration-display").get_attribute(
'textContent')
except:
print("无法获取到视频时长")
return
print("该小节共{0}个视频,当前播放进度:第{1}个视频 {2},结束时间是:{3}".format(allnum,curnum, vedio_stat_time, vedio_end_time))
time.sleep(4) # 每5秒检测一次视频是否完成
return vedio_stat_time, vedio_end_time
def is_next_course():
browser.switch_to.default_content()
time.sleep(1)
#browser.implicitly_wait(3)
try:
h1=browser.find_element_by_xpath("/html/body/div[3]/div/div[2]/h1").get_attribute("textContent")
except:
try:
h1=browser.find_element_by_tag_name("h1").get_attribute("textContent")
except:
print("无法获取到本小节标题")
return
if mycourse == English:
try:
next_page=browser.find_element_by_xpath("/html/body/div[3]/div/div[2]/div[1]/div[2]")
next_page.click()
except:
try:
next_page=browser.find_element_by_class_name("orientationright ")
next_page.click()
except:
print("无法获取单个下一页按钮")
else:
try:
try:
next_page=browser.find_element_by_xpath("/*[@id='right1']")
next_page.click()
except:
next_page=browser.find_element_by_id("right1")
next_page.click()
except:
try:
try:
next_page=browser.find_element_by_xpath("/*[@id='right2']")
next_page.click()
except:
next_page=browser.find_element_by_id("right2")
next_page.click()
except:
try:
try:
next_page=browser.find_element_by_xpath("/*[@id='right3']")
next_page.click()
except:
next_page=browser.find_element_by_id("right3")
next_page.click()
except:
print("3个下一页按钮均无法获取到,尝试获取单独下一页")
try:
next_page=browser.find_element_by_xpath("/html/body/div[3]/div/div[2]/div[1]/div[2]")
next_page.click()
except:
try:
next_page=browser.find_element_by_class_name("orientationright ")
next_page.click()
except:
print("无法获取单个下一页按钮")
else:
print("单个按钮获取成功")
print("点击下一页")
time.sleep(0.5)
try:
_h1=browser.find_element_by_xpath("/html/body/div[3]/div/div[2]/h1").get_attribute("textContent")
except:
try:
_h1=browser.find_element_by_tag_name("h1").get_attribute("textContent")
except:
print("无法获取到下一小节标题")
return
print("当前小节和下一小节是:",h1,_h1)
global flag
if h1 ==_h1:
if (mycourse == Discrete) or (mycourse == Mao):
if flag > 1:
flag=flag-1
return True
else:
return False
else:
return False
else:
if (mycourse == Discrete) or (mycourse == Mao):
flag=3
return True
if __name__ == '__main__':
init()
input_usename_and_password()
choose_course()
is_notice()
into_start_study_window()
while True:
finish_task()
if is_next_course() == False:
print("学习结束")
break
else:
print("开始学习下一小节")
更新(2020-4-14)
学习通登录界面进行了更新,修改部分登录代码
def input_usename_and_password():
#inp=input("请输入账号:")
#inp2=input("请输入密码:")
inp=""
inp_2=""
username = browser.find_element_by_id("phone")
password = browser.find_element_by_id("pwd")
ActionChains(browser).move_to_element(username).click().perform()
username.send_keys(inp)
ActionChains(browser).move_to_element(password).click().perform()
password.send_keys(inp_2)
login = browser.find_element_by_id("loginBtn")
time.sleep(0.5)
login.click()
alert = browser.switch_to.alert
time.sleep(0.5)
if(alert != None):
browser.switch_to.alert.accept()
time.sleep(2)
browser.refresh();#刷新网页
版权声明:本文为weixin_43631185原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。