基于python和selenium实现网络视频课程学习

本文主要是采用 python和selenium 来实现大学生网络某校的自动化视频课程学习,首先需要下载自己Chrome浏览器的版本驱动,然后运行脚本即可。当前版本的代码可能有一些小问题,欢迎各位大佬批评指正。本文及源代码仅限于学习交流,严禁用于商业用途!

一、Chrome驱动下载

1、查看Chrome版本

打开Chrome浏览器,在地址栏输入 chrome://version/

chrome://version/

如图所示,我们可以看到自己的Chrome的版本,“126.0.6478.57”。

 2、下载驱动

点击下面的链接进入下载界面。(这个链接可能要科学上网工具)

ChromeDriver - WebDriver for Chrome - Downloads (chromium.org)

在“下载内容”界面下滑查找自己对应的版本,然后下载符合自己电脑配置的链接下载,如果下滑界面中没有自己想要的版本,则点击红色框的这个链接 。

打开红色框的链接后是以下界面,对照版本信息,只看前三位 “ 126.0.6478.* ” ,能对应上就行。

然后选择我们想要的驱动“chromedriver”,我的电脑是64位,所以我选择“win64”,然后将后面的链接复制到浏览器中就可以下载了。 

3、驱动路径

我们把下载的压缩包解压,找到“chromedriver.exe”,并把它放置到与浏览器“Chrome.exe”相同的文件夹下。

我的是在:C:\Program Files\Google\Chrome\Application

然后在代码中写入:

from selenium import webdriver

# 无界面的浏览器
# option = webdriver.ChromeOptions()
# option.add_argument("headless")
# browser = webdriver.Chrome(options=option)

# 有界面的浏览器
browser = webdriver.Chrome()

二、代码部分

1、selenium的安装与使用

在环境中输入“ pip install selenium ”即可安装,安装后可能会出现版本不兼容的报错。

这种报错就按照要求上调或者下调(重新安装新版本的库)库的版本就可以了。

2、登录

首先,输入用户名和密码,实现登录。

def login():
    # Find the login elements and login
    try:
        print("----------输入用户名和密码进行登录----------")
        # 用户输入用户名和密码
        input_username = input("请输入您的用户名:")
        input_password = input("请输入您的密码:")
        
        # input_username = "1"
        # input_password = "2"


        # 等待用户名和密码输入框可见
        username = WebDriverWait(browser, 10).until(
            EC.presence_of_element_located((By.XPATH, '//form[1]/div[1]/div[2]/div[1]/div[1]/input[1]'))
        )
        password = WebDriverWait(browser, 10).until(
            EC.presence_of_element_located((By.XPATH, '//form[1]/div[1]/div[2]/div[1]/div[2]/input[1]'))
        )

        print("正在输入用户名 ...")
        username.send_keys(input_username)
        time.sleep(1)  # 确保输入框切换到密码框
        print("正在输入密码 ...")
        password.send_keys(input_password)
        
        time.sleep(1)

        # 填写完成后自动点击进行登录
        print("正在登录 ...\n")        
        login_button = WebDriverWait(browser, 10).until(
            EC.element_to_be_clickable((By.XPATH, "//form[1]/div[1]/div[2]/div[1]/div[4]/button"))
        )
        login_button.click()
        
        time.sleep(3)
        
        if "login" not in browser.current_url:
            print("成功登录,当前URL为:", browser.current_url)
            realname = browser.find_element(By.CLASS_NAME, "red").text
            print(realname)
        else:
            print("登录失败!请检查您的用户名和密码是否正确!")

            # 判断是否密码错误,如果密码错误,会有一个提示,则重新输入账号密码
            while True:
                try:
                    error_message = WebDriverWait(browser, 10).until(
                        EC.presence_of_element_located((By.XPATH, '//form[1]/div[1]/div[2]/div[1]/div[2]/label'))
                    )
                    print("系统错误消息文本:", error_message.text)  # 打印错误消息文本内容
                    if error_message.text == "用户名或密码错误" or error_message.text == "用户名或密码错误!":
                        print("用户名或密码错误,请重新输入")
                        
                        input_username = input("请输入您的用户名:")
                        input_password = input("请输入您的密码:")
                        username.clear()
                        password.clear()
                        username.send_keys(input_username)
                        password.send_keys(input_password)
                        browser.find_element(By.XPATH, "//form[1]/div[1]/div[2]/div[1]/div[4]/button").click()
                        
                        time.sleep(3)
                        
                        if "login" not in browser.current_url:
                            break
                    else:
                        break
                except Exception as e:
                    print(f"Error: {e}")
                    break

        # Wait for login to complete
        time.sleep(3)

    except Exception as e:
        print(f"Error logging in: {e}")
        browser.close()

3、进入学习,检查专题课程列表

登录成功后,需要按照自己的课程来设置要刷哪几个部分。这里设置的是刷前面两个专题课程。如果只是刷完要求的时间,不用修改;如果要把全部课程都看完,把判断的值改成<150。

def start_courses():
    # Find the study elements and study
    try:
        print("\n进入学习 ......")
        
        study_button = WebDriverWait(browser, 10).until(
            EC.presence_of_element_located((By.XPATH, '//body/div[2]/div[7]/div[2]/div[1]/div[2]/div[1]/div[2]/div[1]/div[3]/p[1]/a'))
        )
        
        browser.execute_script("arguments[0].click();", study_button)
        
        time.sleep(3)
        
        if len(browser.window_handles) > 1:
            # 切换到新窗口
            browser.switch_to.window(browser.window_handles[1])
            print("切换到新窗口 ......")            
            print("查看专题课程列表 ......")
            
            courses = browser.find_elements(By.CLASS_NAME, "xxk")
            courses_completed = 0  # 初始化已完成课程数

            while courses_completed < 2:    # len(courses)
                courses = browser.find_elements(By.CLASS_NAME, "xxk")

                for course_index in range(2):  # len(courses)                    
                    course = browser.find_elements(By.CLASS_NAME, "xxk")[course_index]
                    try:
                        course_title = course.find_element(By.TAG_NAME, "h2").text
                        print(f"\n🔴 检查课程: {course_title}")

                        progress_text = course.find_element(By.CLASS_NAME, "jd").text
                        progress_percentage = float(progress_text.replace('%', ''))
                        print(f">>>>>>>>>> 完成度: {progress_percentage}%")

                        if progress_percentage < 100.0:
                            courses_completed += 1  # 发现未完成课程
                            print(f"\n开始课程: {course_title}")
                            view_button = course.find_element(By.CLASS_NAME, "btnBig2")
                            view_button.click()
                            watch_video_and_complete(course_title)
                            # browser.switch_to.window(browser.window_handles[1])  # 切换回课程列表窗口

                        else:
                            print(f"✔ 已完成课程: {course_title}")
                    except Exception as e:
                        print(f"Error processing course {course_title}: {e}")

                if courses_completed == 2:   # len(courses)
                    print("所有课程已完成!")
                    browser.close()
                    break
                else:
                    print("等待未完成课程 ...")
                    time.sleep(5)  # 等待 60 秒后再次检查
        else:
            print("未切换到新窗口 ......")

    except Exception as e:
        print(f"Error studying: {e}")
        browser.close()

4、进入课程,检查章节列表

进入专题,依次检查每个章节是否完成度100%,完成则跳过。

def watch_video_and_complete(course_title):
    """观看视频并完成课程"""
    print(f"开始观看视频课程: {course_title}")
   
    try:
        course_list_div = WebDriverWait(browser, 30).until(
            EC.presence_of_element_located((By.ID, "J_listContent"))
        )
        
        chapters_total = len(course_list_div.find_elements(By.CSS_SELECTOR, "tbody tr[class]"))
        chapters_completed = 0  # 初始化已完成章节数

        while chapters_completed < chapters_total:            
            chapters = course_list_div.find_elements(By.CSS_SELECTOR, "tbody tr[class]")

            for chapter_index in range(len(chapters)):
                # 每次循环迭代开始时,重新定位 chapter 元素                
                chapter = chapters[chapter_index]

                try:
                    progress_elements = chapter.find_elements(By.CSS_SELECTOR, ".progressvalue")
                    if not progress_elements:
                        print("进度值元素未找到,跳过检查")
                        continue

                    progress_text = progress_elements[0].text
                    progress_percentage = float(progress_text.replace('%', ''))
                    if progress_percentage < 100.0:
                        print(f"\n>>> 开始章节: {chapter.text},完成度:{progress_percentage}%")
                        
                        view_button = chapter.find_element(By.CLASS_NAME, "golearn")
                       
                        # 使用JavaScript点击被覆盖的元素
                        browser.execute_script("arguments[0].click();", view_button)
                        
                        browser.switch_to.window(browser.window_handles[-1])
                        WebDriverWait(browser, 10).until(
                            EC.presence_of_element_located((By.XPATH, "//body/div[2]/div[1]/div[2]/div[1]/ul[1]/li[1]/div[2]/ul/li"))
                        )
                        video_list = browser.find_elements(By.XPATH, "//body/div[2]/div[1]/div[2]/div[1]/ul[1]/li[1]/div[2]/ul/li")

                        # 播放视频列表
                        flag = watch_video_list(video_list)

                        if flag is True:
                            chapters_completed += 1  # 章节完成度+1                            
                            break  # 跳出当前章节循环,重新获取章节列表
                    else:
                        chapters_completed += 1  # 章节完成度+1
                        print(f"\n章节 {chapter.text} 已完成,跳过")
                except Exception as e:
                    print(f"处理章节时出错: {e}")

    except Exception as e:
        print(f"Error: {e}")

    print(f"\n完成观看视频课程: {course_title}")
    browser.back()
    browser.refresh()

5、进入章节,检查视频列表

检查章节内的视频是否完成度100%,完成则跳过。这里视频播放速度设置为2.5倍。

def watch_video_list(video_list):
    """播放章节中的视频列表"""
    for video_item in video_list:

        # 创建并启动弹窗检查线程
        popup_thread = threading.Thread(target=check_popup)
        popup_thread.daemon = True  # 设置为守护线程,主线程结束时自动退出
        popup_thread.start()

        progress_element = video_item.find_element(By.CLASS_NAME, "cvtb-MCK-CsCt-studyProgress")
        progress_percentage = float(progress_element.text.replace('%', ''))
        if progress_percentage < 100.0:
            print(f"\n--> 视频 {video_item.accessible_name} 未完成,即将播放 ......")

            video_item.click()
            video_element = WebDriverWait(browser, 20).until(
                EC.presence_of_element_located((By.TAG_NAME, "video"))
            )

            # 获取视频时长并转换为秒数
            video_length_element = video_item.find_element(By.CLASS_NAME, "cvtb-MCK-CsCt-length")
            video_length = video_length_element.text
            hours, minutes, seconds = map(int, video_length.split(":"))
            video_duration = (hours * 3600) + (minutes * 60) + seconds
            
            time.sleep(5)
            print(f"▶️正在播放:视频 {video_item.accessible_name} ......")

            # 使用 JavaScript 设置播放速度
            browser.execute_script("arguments[0].playbackRate = 2.5;", video_element)

            # 等待视频播放完毕
            print(f"▶️等待视频播放 {video_duration / 2.5} 秒 ......")
            time.sleep(video_duration / 2.5)
            print(f"视频播放完毕,即将检查进度 ......")

            # 等待一段时间以确保视频播放完成
            time.sleep(3)

            progress_element = video_item.find_element(By.CLASS_NAME, "cvtb-MCK-CsCt-studyProgress")
            progress_percentage = float(progress_element.text.replace('%', ''))
            if progress_percentage < 100.0:
                print(f"视频未完成,请重新播放")
                video_item.click()
            else:
                print(f"视频 {video_item.accessible_name} 已完成")
        else:
            print(f"\n--> 视频 {video_item.accessible_name} 已完成,跳过")
            continue

    # 在播放完所有视频后刷新页面
    browser.close()
    browser.switch_to.window(browser.window_handles[-1])
    browser.refresh()
    return True

6、检查并关闭弹窗线程

观看20分钟就会有弹窗,关闭弹窗的线程每隔2秒检查一次是否出现弹窗。

def check_popup():
    """检查弹窗并关闭"""
    while True:
        try:
            # 检查弹窗是否出现
            rest_tip = WebDriverWait(browser, 5).until(
                EC.presence_of_element_located((By.ID, "rest_tip"))
            )
            # 点击继续学习按钮
            continue_button = rest_tip.find_element(By.TAG_NAME, "button")
            continue_button.click()
            print("已关闭弹窗,继续学习!")
        except:
            # print("未检测到弹窗")
            pass
        time.sleep(2)  # 每隔 2 秒检查一次弹窗

7、main函数

欢迎各位大佬批评指正!欢迎各位评论关注留言!如需转载,请附上本文原文出处。

  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
数模神经网络是指使用神经网络模型来解决数学建模问题的方法。在Python中,可以使用BP神经网络或卷积神经网络实现数模神经网络。BP神经网络在手写数字识别等问题上表现良好,可以使用Python的numpy库完成手写数字数据集的识别,搭建神经网络并进行模型训练和性能评估。卷积神经网络也可以用于手写数字识别系统的设计,通过对数据集进行卷积操作实现多分类问题的解决,同时也可以使用Python进行模型的训练和性能评估。在Python中,可以使用不同的定位方式来定位元素,如id定位、class_name定位、tag_name定位、name定位、LINK_TEXT定位、CSS_SELECTOR定位以及XPATH定位等方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [python实现BP神经网络回归预测模型,使用BP神经网络实现手写数字识别,一万字报告](https://download.csdn.net/download/sinat_41393249/85694802)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Python课程设计—基于卷积神经网络手写数字识别系统.zip](https://download.csdn.net/download/weixin_55305220/85750834)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [selenium+python代码合集](https://download.csdn.net/download/qq_44700741/88269968)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值