0


基于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函数

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

标签: python 学习

本文转载自: https://blog.csdn.net/Clin6/article/details/139621686
版权归原作者 菜狗裹裹 所有, 如有侵权,请联系我们删除。

“基于python和selenium实现网络视频课程学习”的评论:

还没有评论