Python YouTube频道视频下载自动化代码故障求助
问题排查与修正方案
核心问题分析
你的代码无报错但未下载视频,本质是未正确定位到视频链接元素,导致后续下载逻辑完全未执行,同时代码流程存在缩进和逻辑错位问题。
具体问题点
元素定位错误
YouTube的视频标题链接是<a>标签,而非你代码中写的<input>标签,原XPath//input[@id='video-title']无法匹配到任何元素,links为空列表,循环下载的代码根本不会运行。滚动与链接获取逻辑错位
你把获取链接的代码放在了while循环内的break判断之后,若第一次滚动就触底(页面高度不变),程序会直接跳出循环,完全跳过链接收集和下载步骤。文件写入模式错误
每次循环都用'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
相关产品推荐
相关产品推荐

