【问题标题】:YouTube API: Not getting all videos of the given channelYouTube API:未获取给定频道的所有视频
【发布时间】: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 端实现的限制

标签: python python-3.x api youtube-api youtube-data-api


【解决方案1】:

正如 cmets 中已经提到的,可以从结果中检索到的最大视频是 50。因此,如果您想访问其他 51-100 等等,则必须使用nextPageToken

pageToken

pageToken 参数标识结果集中应返回的特定页面。在 API 响应中, nextPageToken 和 prevPageToken 属性标识其他页面 可以找回来。

查看Python on App Engine Code Samples 以获取使用 Python 进行 Youtube API 调用的示例。

【讨论】:

    【解决方案2】:

    搜索调用并非用于枚举频道。

    我是 HTML 抓取频道 > 视频页面,直到我最近发现了这个。

    https://stackoverflow.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)。

    【讨论】:

      猜你喜欢
      • 2015-07-16
      • 2015-09-02
      • 2016-03-01
      • 2016-03-12
      • 2013-09-28
      • 2017-11-21
      • 2019-02-10
      • 1970-01-01
      相关资源
      最近更新 更多