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

如何通过网页抓取获取YouTube视频的重播热点图数据

解决YouTube视频热点图数据抓取问题

问题分析

你之前的方案失效主要有两个核心原因:

  1. 绝对XPath依赖固定DOM层级,YouTube页面结构频繁更新,极易失效;
  2. 热点图属于动态加载内容,仅等待元素存在可能不够,需确保数据已完成渲染。

可行解决方案

方案1:改进Selenium定位与等待逻辑

用相对定位替代绝对XPath,配合WebDriverWait实现可靠等待:

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.Firefox()
driver.get("https://www.youtube.com/watch?v=09wcDevb1q4")

# 等待热点图容器加载(最多等待10秒)
heat_map_container = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.CLASS_NAME, "ytp-heat-map"))
)

# 获取所有热点图路径元素
heat_map_paths = heat_map_container.find_elements(By.TAG_NAME, "path")

# 提取热点图数据(SVG路径的d属性)
for path in heat_map_paths:
    heatmap_data = path.get_attribute("d")
    print(heatmap_data)

driver.quit()

优势:通过ytp-heat-map类定位容器的相对方式,比绝对XPath稳定性高很多;WebDriverWait避免了死循环的无限等待风险。

方案2:抓包获取内部API数据

热点图数据实际由YouTube内部API返回,可通过浏览器开发者工具抓包获取:

  1. 打开视频页面,按下F12进入开发者工具,切换到「Network」标签;
  2. 过滤「XHR/Fetch」请求,刷新页面后查找包含heatmap或player关键词的请求;
  3. 复制请求的URL、Headers(包括Cookie、User-Agent、X-Youtube相关标识)和参数;
  4. 用requests库模拟请求,直接解析返回JSON中的热点图字段。

示例代码框架:

import requests

headers = {
    "User-Agent": "你的浏览器User-Agent",
    "Cookie": "你的浏览器Cookie",
    # 其他必要Headers,如X-Youtube-Client-Name、X-Youtube-Client-Version等
}

params = {
    "videoId": "09wcDevb1q4",
    # 其他请求参数,从抓包结果复制
}

response = requests.get("抓包得到的API URL", headers=headers, params=params)
heatmap_data = response.json()["path_to_heatmap_data"]
print(heatmap_data)

优势:直接获取原始数据,无需处理DOM渲染,效率更高。

方案3:Selenium配合BeautifulSoup解析

如果需要结合DOM解析,确保页面完全渲染后再提取源码:

from selenium import webdriver
from bs4 import BeautifulSoup
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

driver = webdriver.Firefox()
driver.get("https://www.youtube.com/watch?v=09wcDevb1q4")

# 等待热点图元素加载完成
WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.CLASS_NAME, "ytp-heat-map-path"))
)

# 获取完整页面源码
page_source = driver.page_source
soup = BeautifulSoup(page_source, "html.parser")

# 提取所有热点图路径元素
heat_map_paths = soup.find_all("path", class_="ytp-heat-map-path")

for path in heat_map_paths:
    print(path.get("d"))

driver.quit()

注意事项

  • YouTube的DOM结构和API接口会定期更新,需定期验证抓取逻辑;
  • 频繁抓取可能触发反爬机制,建议添加请求间隔、使用代理,必要时登录账号;
  • SVG路径的d属性需进一步解析:x坐标对应视频时间点,y坐标高度对应热度值。

内容的提问来源于stack exchange,提问作者Kevin M.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 19:30:43