YouTube API:未获取给定频道的所有视频
Posted
技术标签:
【中文标题】YouTube API:未获取给定频道的所有视频【英文标题】:YouTube API: Not getting all videos of the given channel 【发布时间】:2018-03-30 11:40:30 【问题描述】:我一直在尝试获取给定频道 ID 的所有视频。但我没有收到所有视频
代码我试图检索频道的所有视频:
api_key = API_KEY
base_video_url = 'https://www.youtube.com/watch?v='
base_search_url = 'https://www.googleapis.com/youtube/v3/search?'
raw_url = 'https://www.googleapis.com/youtube/v3/' \
'channels?key=&forUsername=&part=id'
def getChannelID(username):
''' returns the channel ID '''
r=requests.get(raw_url.format(api_key,username))
json=r.json()
print(json['items'][0]['id'])
return json['items'][0]['id']
def getchannelVideos():
''' returns list of all videos of a given channel '''
chanId=getChannelID('tseries')
first_url = base_search_url + \
'order=date&part=snippet&channelId=&maxResults=50&key='\
.format(chanId,api_key)
video_links = []
url = first_url
while True:
inp = requests.get(url)
resp = inp.json()
for i in resp['items']:
if i['id']['kind'] == "youtube#video":
video_links.append(base_video_url + i['id']['videoId'])
try:
next_page_token = resp['nextPageToken']
url = first_url + '&pageToken='.format(next_page_token)
except:
break
print('working') #used this to count repetitions of while loop
return video_links
这里给定的频道是T-Series,到目前为止有 11,537 个视频 [click to see the image of the channel showing the count ]但是我只收到了589个视频
我用这条线数了数。 while 循环的迭代次数会做
print('working')
为此,我观察到 while 循环在 19 次迭代后结束(我在许多通道上尝试过,但同样在重复)
这是我提供的最后一次(第 19 次迭代)Json 数据
'etag': "cbz3lIQ2N25AfwNr-BdxUVxJ_QY/7SEM6nSU4tBD7ZsR5Abt5L-uqAE",
'items': [],
'kind': 'youtube#searchListResponse',
'pageInfo': 'resultsPerPage': 50, 'totalResults': 15008,
'prevPageToken': 'CLYHEAE',
'regionCode': 'IN'
虽然 totalResults 是 15008,为什么 API 不提供 nextpageID ??
【问题讨论】:
AFAIK 在列出频道对象的统计信息时,通过 videoCount 键值检索频道的上传视频计数。您的实施中可能存在的问题:您的 GET 中的 maxResults=50 @BoboDarphmaxResults=50
是在 API 端实现的限制
【参考方案1】:
正如 cmets 中已经提到的,可以从结果中检索到的最大视频是 50。因此,如果您想访问其他 51-100 等等,则必须使用nextPageToken:
pageToken
pageToken 参数标识结果集中应返回的特定页面。在 API 响应中, nextPageToken 和 prevPageToken 属性标识其他页面 可以找回来。
查看Python on App Engine Code Samples 以获取使用 Python 进行 Youtube API 调用的示例。
【讨论】:
【参考方案2】:搜索调用并非用于枚举频道。
我是 html 抓取频道 > 视频页面,直到我最近发现了这个。
https://***.com/a/27872244/975887
基本上步骤是
找到所需频道的频道 ID。 列出播放列表(youtube.channels.list
将 id
设置为 channelId
并将部分设置为 contentDetails
)
找到名称为uploads
的播放列表的ID
列出播放列表项(youtube.playlistItems.list
设置 playlistId
并将 part
设置为 snippet
可选地将 maxResults
设置为 50)
使用nextPageToken
浏览结果
如果您只知道一个视频 ID,您可以调用
youtube.videos.list
并将 id 设置为视频 id 并将part
设置为snippet
并从结果中提取频道 ID。
这列出了频道上传的所有视频,与搜索调用不同的是,几百条后不放弃,结果总是来自指定频道。
作为额外的奖励,与每次通话花费 100+ 配额点的搜索通话相比,每次通话只需 1-3 个配额点(取决于您请求的其他 parts
)。
【讨论】:
以上是关于YouTube API:未获取给定频道的所有视频的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 YouTube Data API v3 从我自己的 YouTube 频道获取所有视频