我一直在尝试获取给定频道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系列,到目前为止已经有11537个视频[点击查看显示计数的频道图像]但我只收到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,尽管总结果是15008??
Search调用不用于枚举通道。
我一直在用HTML抓取频道>视频页面,直到最近发现这个。
https://stackoverflow.com/a/27872244/975887
从本质上讲,步骤是
- 查找所需频道的频道ID
- 列出播放列表(
youtube.channels.list
将id
设置为channelId
,将部分设置为contentDetails
) - 查找名称为
uploads
的播放列表的ID - 列出播放列表项(
youtube.playlistItems.list
设置playlistId
,并将part
设置为snippet
,可选地将maxResults
设置为50) - 使用
nextPageToken
浏览结果
如果您只知道视频ID,则可以调用ID设置为视频ID、
part
设置为snippet
的youtube.videos.list
,并从结果中提取频道ID。
这列出了该频道上传的所有视频,与搜索呼叫不同,它在100个项目后不会放弃,结果总是来自指定频道。
作为额外的奖励,与每次呼叫花费100多个配额点的搜索呼叫相比,每次呼叫仅花费1-3个配额点(取决于您请求的其他parts
)。
正如评论中已经提到的,可以从结果中检索到的最大视频是50。因此,如果你想访问其他51-100等等,你必须使用nextPageToken:
pageToken
pageToken参数标识结果集中应返回的特定页面。在API响应中nextPageToken和prevPageToken属性标识其他页面可以检索到。
查看此Python on App Engine代码示例,了解使用Python进行Youtube API调用的示例。