运维侠职场日记20:用DeepSeek三天通关详解新手必看!保姆级教学python和selenium实现自动在线刷多套视频!

部署运行你感兴趣的模型镜像

一. 痛点

运维侠小白有下面烦恼,听说deepseek可以帮助提升学习python的效率,可是deepseek给的代码也报错,怎么办?

在这里插入图片描述

欢迎阅读:Python邮件自动化大全打工人逆袭

deepseek生成的代码也有可能报错,例如:
在这里插入图片描述

⏰执行报错:由提示得知,是少导入需要的模块,但是补全,还是报错,这就是deepseek的局限性。需要继续发问,才能解决。
在这里插入图片描述
完整解决报错后代码:
在这里插入图片描述

多尝试,困难才会被克服

学习就像追妹子,你只能看到背影,但只要坚持日积月累的付出,迟早她整个人属于你❤。
在这里插入图片描述

二.准备工作

⚠️避免报错:

  1. 文件路径 没有写绝对路径默认是处理python代码所在路径的文件,因此需要把代码文件放到这个处理的文件同一文件夹里。

(1)安装 selenium、webdriver-manager模块

💻 代码:在命令行终端执行

# 安装必要库(命令行执行)
pip install selenium==4.1.0 webdriver-manager==3.5.3

在这里插入图片描述

三.高级版-多套课程视频自动播放

⚠️避免报错:

  1. 文件路径 没有写绝对路径默认是处理python代码所在路径的文件,因此需要把代码文件放到这个处理的文件同一文件夹里。

💻 代码:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
import random
import time


class AdvancedVideoBot:
    def __init__(self):
        self.driver = self._init_browser()
        self.wait = WebDriverWait(self.driver, 20)

    def _init_browser(self):
        # 防检测浏览器配置
        options = webdriver.EdgeOptions()
        options.add_argument("--disable-blink-features=AutomationControlled")
        options.add_argument("--start-maximized")
        options.add_experimental_option("excludeSwitches", ["enable-automation"])
        return webdriver.Edge(options=options)

    def _human_interaction(self):
        """模拟人类交互行为"""
        # 随机滚动
        self.driver.execute_script(f"window.scrollBy(0, {random.randint(200, 800)})")
        # 鼠标随机移动
        ActionChains(self.driver).move_by_offset(
            random.randint(-50, 50),
            random.randint(-50, 50)
        ).perform()
        time.sleep(random.uniform(0.5, 1.5))

    def _find_real_videos(self):
        """精准定位视频元素的三种方法"""
        # 方法1:通过video标签
        video_tags = self.driver.find_elements(By.TAG_NAME, 'video')
        # 方法2:通过通用播放器class
        player_divs = self.driver.find_elements(By.CSS_SELECTOR, '.video-player, .player-container')
        # 方法3:通过aria-label属性
        aria_elements = self.driver.find_elements(By.CSS_SELECTOR, '[aria-label*="video" i], [aria-label*="播放" i]')

        # 合并去重
        all_elements = list({elem for group in [video_tags, player_divs, aria_elements] for elem in group})
        print(f"🔍 发现潜在视频元素 {len(all_elements)} 个")
        return all_elements

    def _smart_play(self, element):
        """智能播放策略"""
        try:
            # 先尝试点击播放按钮
            play_btn = element.find_element(By.CSS_SELECTOR, '.play-button, .vjs-play-control')
            self.driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", play_btn)
            play_btn.click()
            print("✅ 通过播放按钮启动")
        except:
            # 直接调用play() API
            self.driver.execute_script("arguments[0].play()", element)
            print("✅ 通过API强制播放")

        # 双重验证播放状态
        is_playing = self.driver.execute_script("""
            return !arguments[0].paused && 
                   arguments[0].readyState > 2 && 
                   arguments[0].currentTime > 0
        """, element)
        return is_playing

    def process_course(self, url):
        self.driver.get(url)

        # 处理iframe嵌套的情况
        for _ in range(3):  # 最多尝试3层iframe
            try:
                iframe = self.wait.until(EC.presence_of_element_located((By.TAG_NAME, 'iframe')))
                self.driver.switch_to.frame(iframe)
                print("🔄 切换到iframe层")
            except:
                break

        # 动态加载检测(滚动加载)
        last_count = 0
        for _ in range(3):  # 最多滚动3次
            self._human_interaction()
            current_count = len(self._find_real_videos())
            if current_count == last_count:
                break
            last_count = current_count

        # 精准识别视频元素
        valid_videos = []
        for elem in self._find_real_videos():
            if elem.size['width'] > 100 and elem.size['height'] > 100:  # 过滤装饰性小元素
                valid_videos.append(elem)
        print(f"🎯 确认有效视频 {len(valid_videos)} 个")

        # 逐个处理视频
        for idx, video in enumerate(valid_videos, 1):
            print(f"\n📺 正在处理第 {idx} 个视频")
            for retry in range(3):
                if self._smart_play(video):
                    # 智能等待(根据视频时长)
                    duration = self.driver.execute_script("return arguments[0].duration", video)
                    wait_time = min(3600, int(duration * 0.8))  # 观看80%内容
                    print(f"⏳ 预计观看 {wait_time} 秒")
                    time.sleep(wait_time)
                    break
                else:
                    print(f"⚠ 第{retry + 1}次播放尝试失败")

    def run(self, course_urls):
        try:
            # 手动登录阶段
            self.driver.get("https://le.ouchn.cn/")
            input("请手动登录后按回车继续...")

            # 批量处理课程
            for url in course_urls:
                print(f"\n🔗 开始处理课程:{url}")
                self.process_course(url)

        finally:
            self.driver.quit()


if __name__ == "__main__":
    bot = AdvancedVideoBot()
    courses = [
        "https://le.ouchn.cn/courseDetails/CSMC0000012933",
        "https://le.ouchn.cn/courseDetails/8c885054-1ef3-11ee-bd5f-fa163ea9b0ea/SQJY4476207084651"
    ]
    bot.run(courses)

如图:
在这里插入图片描述

⏰提示:一种需求可以有多种类型代码实现,实际中,我们可以从中选择,最适合的。

更多高级版下期更新

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术职场教练

您的是我坚持原创免费作品的不懈

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值