YouTube API:未获取指定频道的所有视频

时间:2017-10-18 14:40:35

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

我一直在尝试获取给定频道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个视频

我用这条线计算了号码。循环时的迭代次数

  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'}

为什么API不提供nextpageID虽然totalResults是15008 ??

2 个答案:

答案 0 :(得分:1)

搜索呼叫并非旨在枚举频道。

直到最近我发现它之前,我都是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)。

答案 1 :(得分:0)

正如评论中已经提到的,可以从结果中检索到的最大视频数为50.因此,如果您想要访问其他51-100等等,则必须使用{{3} }:

  

pageToken

     

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

在使用Python进行Youtube API调用时,请查看此nextPageToken以获取示例。