Python+Selenium挂课脚本

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版权协议,转载请附上原文出处链接和本声明。