Python Selenium爬取YouTube视频标题时循环仅获取首个元素如何解决
问题原因及修复方案
- 类名选择器使用错误:
By.CLASS_NAME仅支持传入单个类名,你传入的style-scope ytd-grid-renderer是两个类名的组合,匹配不到正确的元素 - 容器定位错误:你选择的
ytd-grid-renderer是整个视频列表的外层容器,不是单个视频的容器,所以遍历的时候只会拿到1个外层容器,自然只能输出1个标题 - 缺少等待逻辑:YouTube页面采用动态懒加载机制,页面刚打开时不会加载全部视频元素,未加等待直接查找元素会出现元素未加载完成、获取结果不全的问题
修正后的代码
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time # 路径前加r声明为原始字符串,避免反斜杠转义问题 s = Service(r'C:\webdrivers\chromedriver.exe') driver = webdriver.Chrome(service=s) # 设置全局隐式等待超时时间 driver.implicitly_wait(10) driver.get("https://www.youtube.com/c/TechWithTim/videos?view=0&sort=p&flow=grid") # 显式等待单个视频容器加载完成 WebDriverWait(driver, 15).until( EC.presence_of_element_located((By.CLASS_NAME, 'ytd-grid-video-renderer')) ) # 模拟滚动加载懒加载视频,滚动次数按需调整即可 for _ in range(3): driver.execute_script("window.scrollTo(0, document.documentElement.scrollHeight);") time.sleep(2) # 定位所有单个视频的容器 videos = driver.find_elements(By.CLASS_NAME, 'ytd-grid-video-renderer') titles = [] for video in videos: title = video.find_element(By.XPATH, './/*[@id="video-title"]') print(title.text) titles.append(title.text) driver.quit()
额外说明
如果遇到title.text为空的情况,可以替换为title.get_attribute('textContent')或者title.get_attribute('aria-label')获取标题内容。
内容的提问来源于stack exchange,提问作者QJ123123
相关产品推荐
相关产品推荐

