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

Python Selenium爬取YouTube频道视频:元素定位失败求助

解决Selenium爬取YouTube频道视频元素为空的问题

问题描述

我正在使用Python的Selenium库爬取YouTube频道的视频信息,以下是我的代码。其中代码行videos = driver.find_elements(By.CLASS_NAME, 'style-scope ytd-grid-video-renderer')始终无法获取视频元素(执行print(videos)输出空列表),请问如何修改代码以获取当前加载页面的所有视频?

原代码:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
driver.get('https://www.youtube.com/wendoverproductions/videos')

videos = driver.find_elements(By.CLASS_NAME, 'style-scope ytd-grid-video-renderer')
print(videos)

urls = []
titles = []
dates = []

for video in videos:
    video_url = video.find_element(by=By.XPATH, value='.//*[@id=\"video-title\"]').get_attribute('href')
    urls.append(video_url)
    video_title = video.find_element(by=By.XPATH, value='.//*[@id=\"video-title\"]').text
    titles.append(video_title)
    video_date = video.find_element(by=By.XPATH, value='.//*[@id=\"metadata-line\"]/span[2]').text
    dates.append(video_date)

问题原因

  1. 页面未完全加载:YouTube是动态渲染页面,代码执行元素查找时,视频元素还未加载完成。
  2. 定位选择器无效:style-scope ytd-grid-video-renderer是YouTube通用的动态类,不是唯一标识,无法准确定位视频元素。

修改后的代码

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

driver = webdriver.Chrome()
driver.get('https://www.youtube.com/wendoverproductions/videos')

# 显式等待视频元素加载完成,超时10秒
wait = WebDriverWait(driver, 10)
# 直接定位视频容器标签ytd-grid-video-renderer,这是每个视频项的稳定容器
videos = wait.until(EC.presence_of_all_elements_located((By.TAG_NAME, 'ytd-grid-video-renderer')))

print(f"找到{len(videos)}个视频")

urls = []
titles = []
dates = []

for video in videos:
    # 用CSS选择器替代XPATH,更简洁稳定
    video_url = video.find_element(By.CSS_SELECTOR, '#video-title').get_attribute('href')
    urls.append(video_url)
    
    video_title = video.find_element(By.CSS_SELECTOR, '#video-title').text
    titles.append(video_title)
    
    video_date = video.find_element(By.CSS_SELECTOR, '#metadata-line span:nth-child(2)').text
    dates.append(video_date)

# 打印结果验证
for title, url, date in zip(titles, urls, dates):
    print(f"标题:{title}\n链接:{url}\n发布日期:{date}\n")

driver.quit()

关键修改说明

  • 添加显式等待:使用WebDriverWait配合presence_of_all_elements_located,确保页面中所有视频元素加载完成后再执行查找,避免因页面未渲染完成导致的空列表。
  • 更换定位方式:放弃不稳定的Class选择器,直接使用视频项的容器标签ytd-grid-video-renderer定位,该标签是YouTube视频列表中每个视频的固定容器,定位更可靠。
  • 优化内部元素定位:将XPATH替换为CSS选择器,语法更简洁,且在动态页面中稳定性更好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 21:35:58