使用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
相关产品推荐
相关产品推荐

