最近看到隔壁室友在学习python,再加上那句“爬虫学得好,监狱进的早”,于是有了一个大胆的想法,刷网课。我是通过使用selenium驱动真实的浏览器来实现

        1.自动点击播放

        2.自动切换到流畅画质(省流量)

        3.自动1.5倍速

        4.自动静音

        4.自动检查当前播放时间,结束后调到下一集

由于是驱动真实的浏览器来实现一系列操作,所以理论上不会有封号危险 (祝你好运)

# _*_ codeing utf-8 _*_
# @TIME : 2021/11/6 22:30
# @Author : wust Qiuyu
# @File : test_selenium
# @Project : 代码


from selenium import webdriver
from selenium.webdriver.common.by import By
import time
from selenium.webdriver import ActionChains
from selenium.webdriver.chrome.options import Options


# 无界面
def share_browser():  # 初始化
    chrome_options = Options()
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--disable-gpu')

    # 浏览器的安装路径 打开文件位置 #这个路径是你谷歌浏览器的路径
    # chrome浏览器的安装位置   Chromedriver需在当前py文件的相同路径下
    path = r'C:\Users\19436\AppData\Local\Google\Chrome\Application\chrome.exe'
    chrome_options.binary_location = path
    browser = webdriver.Chrome(chrome_options=chrome_options)
    return  browser

# 取消下方注释即可使用有界面
# # # # # # # # # # # # # # # # # # # # # #
# 加载驱动  有界面                         #
path = './chromedriver.exe'            #
browser = webdriver.Chrome(path)        #
# # # # # # # # # # # # # # # # # # # # # #


# # # # # # # # # # # # # # # # # # # # # #
# # 加载驱动  无界面                         #
# browser = share_browser()               #
# # # # # # # # # # # # # # # # # # # # # #



# 答题
def response():
    try:
        #检查是否有弹窗检验
        browser.find_element(By.XPATH,'//div[@id="app"]/div[1]/div[7]/div[@class="el-dialog"]')
        option = browser.find_elements(By.XPATH, '//ul[@class="topic-list"]/li')
        for i in range(len(option)):
            option[i].click()

        # 获取正确答案
        answer = browser.find_element(By.XPATH,"//p[@class='answer']/span").text.split(',')
        print('正确答案是:' + str(answer))

        # 点击正确答案

        for i in range(len(option)):
            print('选项'+str(i)+':'+option[i].text)
            flag=False
            for j in range(len(answer)):
                if option[i].text.find(answer[j])!=-1:
                    flag=True
                    break
            if(flag==False):
                    option[i].click()
        # 点击关闭
        close = browser.find_element(By.XPATH,'//div[@class="btn"]')
        close.click()
        print("答题成功!\t\t\t√")
        play()
        return True
    except:
        print("未找到弹窗测验\t\t✘")
        return False


# 点击我知道了
def clickIknow():
    try:
        # 检测是否有我知道了
        browser.find_element(By.XPATH,'//div[@id="app"]/div[1]/div[6]')
        # 点击我知道了
        iKnow = browser.find_element(By.XPATH,'//div[@id="app"]/div[1]/div[6]/div[1]/div[3]/span/button')
        iKnow.click()
        print("关闭我知道成功!\t√")
        return True
    except:
        print("未发现我知道了\t\t✘")
        return False


# 点击学前必读
def clickBeforeRead():
    try:
        # 检测是否有学前必读
        browser.find_element(By.XPATH,'//div[@id="app"]/div[1]/div[7]')
        # 点击×
        close = browser.find_element(By.XPATH,'//div[@id="app"]/div[1]/div[7]/div[2]/div[1]/i')
        close.click()
        print("关闭学前必读成功!\t√")
        return True
    except:
        print("未发现学前必读\t\t✘")
        return False


# 获取当前播放时间
def getCurrentTime():
    openControlsBar()
    time = browser.find_element(By.XPATH,'//div[@class="nPlayTime"]/span[1]').text
    print('当前播放时间为:'+time)
    return  time

# 获取当前视频总时间
def getTotalTime():
    openControlsBar()
    time = browser.find_element(By.XPATH,'//div[@class="nPlayTime"]/span[2]').text
    print('本集视频时间为:' + time)
    return time

# 播放下一个视频
def nextVideo():
    openControlsBar()
    nextBtn = browser.find_element(By.XPATH,'//div[@id="nextBtn"]')
    nextBtn.click()
    print('\n切换下一个视频\n')

# 1.5速度
def fasterPlay():
    try:
        openControlsBar()
        speed = browser.find_element(By.XPATH,' //div[@class="speedBox"]/div/div[1]')
        speedbox = browser.find_element(By.XPATH,'//div[@class="speedBox"]')
        time.sleep(5)
        openControlsBar()
        ActionChains(browser).move_to_element(speedbox).perform()
        speed.click()
        print('成功切换成'+speed.text+'倍速\t√')
    except:
        print('切换成' + speed.text + '倍速失败,稍后将重试\t✘')

# 点击开始播放
def play():
    start_status = browser.find_element(By.XPATH,'//div[@id="playButton"]').get_attribute('class')
    start_button = browser.find_element(By.XPATH,'//div[@id="playButton"]')
    time.sleep(10)
    if start_status.find('playButton')!=-1:
        print('当前静止')
        openControlsBar()
        time.sleep(1)
        start_button.click()
        print('点击播放成功\t\t√')

# 点击静音
def noVoice():
    try:
        voice_status = browser.find_element(By.XPATH,'//div[@id="vjs_container"]/div[10]/div[6]').get_attribute('class')
        voice_buttton= browser.find_element(By.XPATH,'//div[@id="vjs_container"]/div[10]/div[6]/div[1]')
        print(voice_status)
        if voice_status.find('volumeNone')==-1:
            print('此时非静音')
            time.sleep(5)
            openControlsBar()
            voice_buttton.click()
            print('静音成功\t\t\t√')
    except:
        print('静音失败,稍后将重试\t\t✘')


# 切换流畅画质
def changeVideoQuality():
    try:
        openControlsBar()
        videoQuality =  browser.find_element(By.XPATH,' //div[@class="definiBox"]/div/b[1]')
        definiBox = browser.find_element(By.XPATH,' //div[@class="definiBox"]')
        time.sleep(5)
        openControlsBar()
        ActionChains(browser).move_to_element(definiBox).perform()
        videoQuality.click()
        print('成功切换到流畅画质\t√')
        checkWindow()
    except:
        print('切换到流畅画质失败,稍后将重试\t\t✘')

# 打开ControlsBar
def openControlsBar():
    checkWindow()
    controlsBar = browser.find_element(By.XPATH,' //div[@id="container"]')
    ActionChains(browser).move_to_element(controlsBar).perform()

# 检测弹窗
def checkWindow():
    print(time.strftime('%Y-%m-%d  %H:%M:%S')+'\n'+'正在播放:'+getUnitName())
    clickIknow()
    clickBeforeRead()
    response()
    print('\n\n')

# 获取当前章节
def getUnitName():
    try:
        name = browser.find_element(By.XPATH,'//*[@id="app"]/div/div[2]/div[1]/div[1]/div[1]')
        return  name.text
    except:
        return '暂未加载'
if __name__ == '__main__':
    # 访问网站 课程的地址
    url = 'https://studyh5.zhihuishu.com/videoStudy.html#/studyVideo?recruitAndCourseId=4b595c5c435d4859454a5859584259455f'
    # 账号密码
    userName = "**************"
    passWord = "**************"
    print(time.strftime('%Y-%m-%d  %H:%M:%S')+'\n'+'开始学习\n')
    browser.get(url)
    # 元素定位 输入用户名密码
    print(time.strftime('%Y-%m-%d  %H:%M:%S')+'\n'+'正在输入账号\n')
    inputUsername = browser.find_element(By.XPATH,'//input[@id="lUsername"]')
    inputUsername.send_keys(userName)
    print(time.strftime('%Y-%m-%d  %H:%M:%S')+'\n'+'账号输入成功\n')
    print(time.strftime('%Y-%m-%d  %H:%M:%S')+'\n'+'正在输入密码\n')
    inputPassword = browser.find_element(By.XPATH,'//input[@id="lPassword"]')
    inputPassword.send_keys(passWord)
    print(time.strftime('%Y-%m-%d  %H:%M:%S')+'\n'+'密码输入成功\n')

    # 点击登录
    print(time.strftime('%Y-%m-%d  %H:%M:%S')+'\n'+'正在登陆\n')
    login = browser.find_element(By.XPATH,"//span[@class='wall-sub-btn']")
    login.click()
    print(time.strftime('%Y-%m-%d  %H:%M:%S')+'\n'+'登陆成功\n')
    print(time.strftime('%Y-%m-%d  %H:%M:%S')+'\n'+'正在进入课程\n\n')

    print('----------------------------------')

    import  threading
    from threading import Lock,Thread
    import time,os
    while(True):

        # 有时进入视频会直接弹出窗口,且窗口显示顺序不定,故检测三次,保证再开始播放之前关闭
        print(time.strftime('%Y-%m-%d  %H:%M:%S')+'\n'+'正在在执行视频播放前检查')
        for i in range(3):
            print('\n第' + str(i) + '检测')
            checkWindow()
            time.sleep(2)


        print(time.strftime('%Y-%m-%d  %H:%M:%S')+'\n检查完毕\n\n\n开始优化播放\n')
        # 避免在前三次中未检测出窗口,开始操作前全部检查一次
        checkWindow()
        play()
        print('正在修改画质')
        time.sleep(2)
        checkWindow()
        changeVideoQuality()
        print('画质修改成功\t\t\t√')
        print('正在修该播放速度')
        checkWindow()
        fasterPlay()
        print('播放速度修改成功\t\t\t√')
        print('正在修改静音')
        checkWindow()
        noVoice()
        print('静音修改成功\t\t√\n\n')

        # 每隔5秒检测是否有我知道了,学前必读,是否播放完
        while(True):
            print(time.strftime('%Y-%m-%d  %H:%M:%S'))
            # 播放完毕,下一集
            if getCurrentTime() == getTotalTime():
                print('\n\n')
                checkWindow()
                nextVideo()
                break

            print('\n\n')
            checkWindow()
            print('\n\n')
            time.sleep(5)

需要更换的是账号密码以及url路径,url路径是你先在浏览器中登录进智慧树,点击课程,在播放界面复制地址栏中的URL即可,具体看注释即可

需要安装selenium包 和chrome浏览器驱动下载地址chrome.exe,注意版本相匹配,该驱动器的路径与py文件在同一目录即可

运行结果

C:\Users\19436\Desktop\邱哥\学习资料\Python\代码\venv\Scripts\python.exe C:/Users/19436/Desktop/邱哥/学习资料/Python/代码/test/selenium_ZhiHuiShu.py
C:\Users\19436\Desktop\邱哥\学习资料\Python\代码\test\selenium_ZhiHuiShu.py:25: DeprecationWarning: use options instead of chrome_options
  browser = webdriver.Chrome(chrome_options=chrome_options)
2021-11-15  12:56:45
开始学习

2021-11-15  12:56:48
正在输入账号

2021-11-15  12:56:48
账号输入成功

2021-11-15  12:56:48
正在输入密码

2021-11-15  12:56:49
密码输入成功

2021-11-15  12:56:49
正在登陆

2021-11-15  12:56:49
登陆成功

2021-11-15  12:56:49
正在进入课程

----------------------------------
2021-11-15  12:56:49
正在在执行视频播放前检查

第0检测
2021-11-15  12:56:49
正在播放:暂未加载
未发现我知道了        ✘
未发现学前必读        ✘
未找到弹窗测验        ✘

第1检测
2021-11-15  12:56:53
正在播放:第三章
3.1、辅音(下)
关闭我知道成功!    √
关闭学前必读成功!    √
未找到弹窗测验        ✘

第2检测
2021-11-15  12:56:56
正在播放:第三章
3.1、辅音(下)
未发现我知道了        ✘
未发现学前必读        ✘
未找到弹窗测验        ✘

2021-11-15  12:56:58
检查完毕

开始优化播放

2021-11-15  12:56:58
正在播放:第三章
3.1、辅音(下)
未发现我知道了        ✘
未发现学前必读        ✘
未找到弹窗测验        ✘

正在修改画质
2021-11-15  12:57:10
正在播放:第三章
3.1、辅音(下)
未发现我知道了        ✘
未发现学前必读        ✘
未找到弹窗测验        ✘

切换到流畅画质失败,稍后将重试        ✘
画质修改成功            √
正在修该播放速度
2021-11-15  12:57:16
正在播放:第三章
3.1、辅音(下)
未发现我知道了        ✘
未发现学前必读        ✘
未找到弹窗测验        ✘

切换成倍速失败,稍后将重试    ✘
播放速度修改成功            √
正在修改静音
2021-11-15  12:57:22
正在播放:第三章
3.1、辅音(下)
未发现我知道了        ✘
未发现学前必读        ✘
未找到弹窗测验        ✘

volumeBox
此时非静音
静音成功            √
静音修改成功        √

2021-11-15  12:57:28
当前播放时间为:00:03:56
本集视频时间为:00:25:56

2021-11-15  12:57:28
正在播放:第三章
3.1、辅音(下)
未发现我知道了        ✘
未发现学前必读        ✘
未找到弹窗测验        ✘

2021-11-15  12:57:34
当前播放时间为:00:04:01
本集视频时间为:00:25:56

2021-11-15  12:57:34
正在播放:第三章
3.1、辅音(下)
未发现我知道了        ✘
未发现学前必读        ✘
未找到弹窗测验        ✘

2021-11-15  12:57:39
当前播放时间为:00:04:07
本集视频时间为:00:25:56

2021-11-15  12:57:40
正在播放:第三章
3.1、辅音(下)
未发现我知道了        ✘
未发现学前必读        ✘
未找到弹窗测验        ✘

2021-11-15  12:57:45
当前播放时间为:00:04:13
本集视频时间为:00:25:56

2021-11-15  12:57:46
正在播放:第三章
3.1、辅音(下)
未发现我知道了        ✘
未发现学前必读        ✘
未找到弹窗测验        ✘

进程已结束,退出代码为 -1