You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python YouTube频道视频下载自动化代码故障求助

问题排查与修正方案

核心问题分析

你的代码无报错但未下载视频,本质是未正确定位到视频链接元素,导致后续下载逻辑完全未执行,同时代码流程存在缩进和逻辑错位问题。

具体问题点

  1. 元素定位错误
    YouTube的视频标题链接是<a>标签,而非你代码中写的<input>标签,原XPath //input[@id='video-title']无法匹配到任何元素,links为空列表,循环下载的代码根本不会运行。

  2. 滚动与链接获取逻辑错位
    你把获取链接的代码放在了while循环内的break判断之后,若第一次滚动就触底(页面高度不变),程序会直接跳出循环,完全跳过链接收集和下载步骤。

  3. 文件写入模式错误
    每次循环都用'w'模式打开文件,会覆盖之前写入的内容,即便有下载,也只会保留最后一个链接。

修正后的代码

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
from random import randint
from pytube import YouTube

# 初始化浏览器
driver = webdriver.Firefox()

# 替换为实际频道链接
channel_url = "https://channel_link"

def download_channel_videos(driver, url):
    # 直接访问频道视频列表页
    driver.get(f"{url}/videos")
    time.sleep(randint(5, 9))

    # 滚动加载所有视频(限制最大滚动次数避免无限循环)
    last_scroll_height = driver.execute_script("return document.documentElement.scrollHeight")
    max_scrolls = 10
    scroll_times = 0

    while scroll_times < max_scrolls:
        driver.execute_script("window.scrollTo(0, document.documentElement.scrollHeight);")
        time.sleep(3)
        current_scroll_height = driver.execute_script("return document.documentElement.scrollHeight")
        
        if current_scroll_height == last_scroll_height:
            break
        last_scroll_height = current_scroll_height
        scroll_times += 1

    # 修正XPath,准确定位视频链接
    video_links = driver.find_elements(By.XPATH, "//ytd-rich-item-renderer//a[@id='video-title']")
    print(f"共找到 {len(video_links)} 个视频")

    # 追加模式写入链接,避免覆盖
    with open("d:\\somefile.txt", "a", encoding="utf-8") as link_file:
        for link in video_links:
            video_title = link.get_attribute("title")
            video_href = link.get_attribute("href")
            
            if not video_href:
                print("跳过无效链接")
                continue
            
            print(f"正在下载: {video_title}")
            try:
                yt = YouTube(video_href)
                highest_res_stream = yt.streams.get_highest_resolution()
                highest_res_stream.download("D:\\youtube1\\")
                link_file.write(f"{video_href}\n")
                time.sleep(randint(2, 4))  # 随机延迟降低被限制风险
            except Exception as e:
                print(f"下载失败 {video_title}: {str(e)}")
                continue

download_channel_videos(driver, channel_url)
driver.quit()  # 关闭浏览器释放资源

关键修正说明

  • 修正XPath为//ytd-rich-item-renderer//a[@id='video-title'],限定在视频条目容器内,确保只获取频道内的视频链接。
  • 调整滚动逻辑,增加最大滚动次数限制,避免无限循环,同时确保加载足够多的视频。
  • 使用'a'模式写入文件,保留所有下载记录,添加编码参数防止中文乱码。
  • 增加异常捕获,处理下载中的异常(如年龄限制视频、视频下架等),避免程序中途中断。
  • 最后关闭浏览器,释放系统资源。

内容的提问来源于stack exchange,提问作者Sneider

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 15:48:24