python - 不使用搜索查询从所选频道获取*所有* Youtube 视频 ID
问题描述
从给定频道获取所有视频信息的最便宜的方法似乎是使用从频道的“contentDetails”中找到的“上传”,如此处所述。但这只会返回最近的 20,000 条视频信息。(在 Python 中)
CNN_ID = "UCupvZG-5ko_eiXAupbDfxWw" # CNN channel ID
search_kwargs = {
"part": "contentDetails",
"id": CNN_ID,
}
results = youtube.channels().list(**search_kwargs).execute()
playlist_id = results["items"][0]["contentDetails"]["relatedPlaylists"]["uploads"]
search_kwargs = {
"part": "snippet",
"playlistId": CNN_ID,
}
results = youtube.playlistItems().list(**search_kwargs).execute()
n_total = results["pageInfo"]["totalResults"] # 20000
似乎包含在其中一个播放列表(例如CNN)中的所有视频,我都可以使用Playlists获取他们的信息,例如
search_kwargs = {
"part": "snippet",
"channelId": CNN_ID,
}
results = []
while True:
results.extend(youtube.playlists().list(**search_kwargs).execute()["items"])
if "nextPageToken" not in results[-1]:
break
search_kwargs["pageToken"] = results[-1]["nextPageToken"]
pids = [item["id"] for item in results]
n_total = 0
for pid in pids:
search_kwargs = {
"part": "snippet",
"playlistId": pid,
}
results = youtube.playlistItems().list(**search_kwargs).execute()
n_total += results["pageInfo"]["totalResults"]
# n_total == 42579
这些视频包括较旧的视频。但我仍然无法获取未包含在任何播放列表中的旧视频的信息。有没有办法在不使用Search的情况下获得它们?
解决方案
好吧,做到这一点的最好方法(至少据我所知)是使用 Selenium 从 Youtube 收集视频 ID。向下滚动时,必须找到感兴趣频道的视频部分并收集视频。
推荐阅读
- java - 如何在java(android)中创建子对象
- c# - 为什么我无法使用从 ASP.Net 代码执行的 power shell 命令登录到 Azure?
- angular - 通过调用休息服务使用 Angular 5 上传文档
- javascript - 如何处理除法运算符中的溢出
- sql-server - 如何在 SQL Server 2012 中的普通存储过程中找出存储过程名称
- mongodb - MongoDB查询以使用公式更新集合中文档的每个字段
- spring-mvc - 仅在登录后创建 Spring Mvc 会话
- c++ - arduino 中函数和打印函数值的问题
- java - 模型无法转换为 ModelRealmProxyInterface
- typescript - Vue Cli 3 - Typescript - Vuetify 样式不适用于带有 @WithRender 的单独模板文件