我一直在尝试获取给定频道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 ??
答案 0 :(得分:1)
搜索呼叫并非旨在枚举频道。
直到最近我发现它之前,我都是HTML抓取频道>视频页面的。
基本上步骤是
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
)。
答案 1 :(得分:0)
正如评论中已经提到的,可以从结果中检索到的最大视频数为50.因此,如果您想要访问其他51-100等等,则必须使用{{3} }:
pageToken
pageToken参数标识应返回的结果集中的特定页面。在API响应中, nextPageToken和prevPageToken属性标识其他页面 可以检索。
在使用Python进行Youtube API调用时,请查看此nextPageToken以获取示例。