问答

怎么用 API 拿到 YouTube 视频的标签和简介?

简短回答

YouTube 视频详情接口在 hashtags 字段返回作者设置的标签,在 text 字段返回完整简介,每个视频 $0.004。要研究一个领域,先搜索:一页搜索结果加上前 20 个视频的详情,共 $0.084。

YouTube 不向观众显示视频标签,所以能把标签翻出来的浏览器插件才那么受欢迎。假如你在策划家用意式咖啡的选题,想看看播放量最高的 20 个视频都用了哪些标签、简介怎么写,用插件就得点 20 次、抄一大堆。写个循环调两个接口,几秒钟就完事。

标签和简介在哪

YouTube 视频详情传链接或 ID,返回:

  • hashtags:作者给视频设置的标签(YouTube 叫 keywords)。写在简介里的 # 话题仍然算简介正文的一部分。
  • text:完整简介,包括链接、章节和赞助口播信息。
  • title、published_at、metrics.views、metrics.likes、metrics.comments,以及频道名称和 handle。
  • 加 view=full 时还有 ext.genre(分类)、ext.duration_ms 和 ext.is_paid_promotion。

统计一个领域的标签

import os, requests
from collections import Counter

API = "https://api.okdata.online/v1"
H = {"Authorization": f"Bearer {os.environ['OKDATA_API_KEY']}"}

def get(path, **params):
    body = requests.get(f"{API}/{path}", headers=H, params=params, timeout=60).json()
    if body["code"] != "ok":
        raise RuntimeError(f"{body['code']}: {body['message']}")
    return body["data"]

hits = get("youtube/videos/search", query="home espresso", sort="most_viewed")["items"][:20]
tags = Counter()
for v in hits:
    video = get("youtube/videos/get", id=v["id"], fields="title,hashtags")["item"]
    tags.update(t.lower() for t in (video["hashtags"] or []))

for tag, n in tags.most_common(25):
    print(f"{n:>2}  {tag}")

费用

任务 调用次数 费用
一个视频的标签 1 $0.004
一个主题的前 20 个视频 1 次搜索 + 20 {{cost:youtube.videos.search1+youtube.videos.get20}}
5 个主题,每个 20 个视频 5 + 100 {{cost:youtube.videos.search5+youtube.videos.get100}}

搜索结果里没有标签,真正起作用的是详情这一次调用。

心里要有数的地方

  • 不少热门视频根本没设标签,hashtags 返回空或 null。YouTube 官方也说标签在推荐里作用不大,把它当成了解作者思路的线索,别当成排名公式。
  • 简介往往更有参考价值:前两行、章节时间点和链接都在 text 里。
  • 不返回频道订阅数。
  • 视频被删除或设为私享时返回 not_found,不扣费。

其他办法

  • 官方 Data API。 videos.list 带 part=snippet 就有 tags 和简介,一次最多 50 个视频,只花 1 个配额单位。有 Google key、视频清单也现成的话,这条路更省钱。
  • 标签查看插件。 用眼睛看一两个视频,足够了。
  • 解析网页源码。 YouTube 一改页面结构就失效,这类爬虫经常坏就是这个原因。

跨 YouTube 和其他平台做选题研究,可以看内容研究方案。

更新于