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

使用BeautifulSoup爬取YouTube视频描述链接返回空列表如何解决

问题原因
  • YouTube页面内容为前端JavaScript动态渲染生成:你用requests.get()拿到的只是页面初始的静态HTML源码,视频描述、关联链接这类内容都是用户访问页面后由JS异步加载渲染的,你要匹配的yt-simple-endpoint style-scope yt-formatted-string类的a标签在初始静态源码里根本不存在,所以匹配结果为空。
  • YouTube存在严格的基础反爬机制:直接使用默认UA的requests发起请求,大概率会被返回验证码页面、受限内容页,根本拿不到正常的页面结构。
解决方案

这里提供三种不同场景的落地解决方式:

方式1:使用无头浏览器模拟真实浏览器加载(适合快速验证)

用Selenium/Playwright等工具启动浏览器,等待JS执行完成后再提取元素,示例代码如下:

from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time

chrome_options = Options()
# 无头模式启动,不弹出浏览器窗口
chrome_options.add_argument("--headless=new")
# 替换为真实浏览器UA,绕过基础反爬
chrome_options.add_argument("user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36")

driver = webdriver.Chrome(options=chrome_options)
driver.get('https://www.youtube.com/watch?v=gqUqGaXipe8')
# 等待页面加载完成,可根据网络情况调整时长
time.sleep(3)

soup = BeautifulSoup(driver.page_source, 'lxml')
link = [i['href'] for i in soup.find_all('a', class_='yt-simple-endpoint style-scope yt-formatted-string', href=True)]
print(link)

driver.quit()

方式2:提取静态页内嵌的JSON数据(性能更高,不需要启动浏览器)

YouTube初始静态页会把所有预加载数据存在window.ytInitialData变量里,你可以直接用正则提取该JSON解析得到视频描述,再从中提取链接:

import requests
import re
import json

headers = {
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
}
resp = requests.get('https://www.youtube.com/watch?v=gqUqGaXipe8', headers=headers).text
# 正则匹配ytInitialData内容
data_str = re.search(r'ytInitialData = (.*?);</script>', resp).group(1)
data = json.loads(data_str)
# 提取视频描述字段
desc = data['contents']['twoColumnWatchNextResults']['results']['results']['contents'][1]['videoSecondaryInfoRenderer']['attributedDescription']['content']
# 从描述文本匹配所有链接
links = re.findall(r'https?://\S+', desc)
print(links)

注:ytInitialData的字段路径可能随YouTube更新调整,遇到报错可打印完整data对象自行调整字段提取路径

方式3:调用YouTube官方Data API(最稳定,适合批量爬取)

直接申请YouTube Data API的密钥,调用videos.list接口传入视频ID即可直接拿到结构化的视频描述数据,不会受页面结构变更影响,是长期批量爬取的最优选择。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 23:18:03