如何使用Python和Selenium提取YouTube首页的全部视频URL
解决方案
1. 正确的元素定位规则
YouTube首页推荐视频的跳转链接统一存放在ytd-thumbnail组件下的ID为thumbnail的a标签内,使用XPATH //ytd-thumbnail/a[@id="thumbnail"]即可匹配到所有已加载的推荐视频链接元素。
该元素的href属性为视频相对路径,格式为/watch?v=视频ID,直接提取v参数的值即可得到你需要的视频ID,拼接https://www.youtube.com前缀即可得到完整视频链接。
2. 代码优化修正
你原有代码返回空值的核心原因是缺少页面加载等待逻辑、定位路径错误,同时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 import time driver = webdriver.Chrome('./chromedriver/chromedriver') driver.get("https://www.youtube.com") # 存储已采集的链接,去重 collected_links = set() while True: # 等待元素加载完成 WebDriverWait(driver, 10).until( EC.presence_of_all_elements_located((By.XPATH, '//ytd-thumbnail/a[@id="thumbnail"]')) ) elements = driver.find_elements(By.XPATH, '//ytd-thumbnail/a[@id="thumbnail"]') for ele in elements: href = ele.get_attribute('href') if href and '/watch?v=' in href and href not in collected_links: collected_links.add(href) # 提取视频ID的话可以用下面的代码 video_id = href.split('v=')[-1].split('&')[0] print(f"获取到视频链接:{href},视频ID:{video_id}") # 滚动到页面底部加载更多内容 driver.execute_script("window.scrollTo(0, document.documentElement.scrollHeight);") # 等待新内容加载 time.sleep(2) # 可以自行加终止条件,比如采集到指定数量就break
注意事项
- 如果使用高版本selenium,
find_elements_by_xpath方法已废弃,推荐使用find_elements(By.XPATH, 路径)的写法 - 可以根据自己的需求设置循环终止条件,避免无限滚动
内容的提问来源于stack exchange,提问作者ZeroMaxinumXZ
相关产品推荐
相关产品推荐

