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 @BoboDarph maxResults=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.listid 设置为 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 频道获取所有视频

Youtube API v3 从给定频道获取每个视频 ID

Youtube API - 如何排除未列出的视频?

YouTube API用于获取频道上的所有视频

youtube api v3 从比视频更新的频道中获取所有视频

用于获取频道上所有视频的 Youtube Api(不再可用错误)