问题描述
我遇到了有关Search API的API参考文档:
Note:如果您的请求为
channelId
参数指定了一个值并将type
参数值设置为video
,则搜索结果最多只能包含500个视频, [...]。
我是否需要申请付费帐户才能突破500个视频的限制?如果可以,我该如何申请?
解决方法
如果您需要获取给定频道的所有视频的列表(由其ID标识,例如CHANNEL_ID
),那么您必须按照以下步骤操作:
步骤1:使用参数id=CHANNEL_ID
查询Channels.list
API端点以从API the ID of that channel's uploads playlist获取:
response = youtube.channels().list(
id = CHANNEL_ID,part = 'contentDetails',fields = 'items(contentDetails(relatedPlaylists(uploads)))',maxResults = 1
).execute()
uploads_id = response \
['contentDetails'] \
['relatedPlaylists'] \
['uploads']
上面的代码应只运行一次以获取上载播放列表ID为uploads_id
,然后根据需要使用该ID多次。
通常,频道ID及其对应的上传播放列表ID与s/^UC([0-9a-zA-Z_-]{22})$/UU\1/
相关。
步骤2:使用先前获得的上传播放列表ID(我们将其命名为UPLOADS_ID
),查询PlaylistItems.list
API端点以获取所有视频的列表该播放列表的ID:
request = youtube.playlistItems().list(
playlistId = UPLOADS_ID,part = 'snippet',fields = 'nextPageToken,items(snippet(resourceId))',maxResults = 50
)
videos = []
while request:
response = request.execute()
for item in response['items']:
resource = item['snippet']['resourceId']
if resource['kind'] != 'youtube#video':
continue
videos.append(resource['videoId'])
request = youtube.playlistItems().list_next(
request,response)
运行上述代码后,列表videos
将包含在CHANNEL_ID
所标识的频道上上传的所有视频的ID。
第3步::查询Videos.list
API端点以获取您感兴趣的每个视频的statistics
信息(即对象):
class Stat:
def __init__(video_id,view_count,like_count):
self.video_id = video_id
self.view_count = view_count
self.like_count = like_count
stats = []
while len(videos):
ids = videos[0:50]
del videos[0:50]
response = youtube.videos().list(
id = ','.join(ids),part = 'id,statistics',fields = 'items(id,statistics)',maxResults = len(ids)
).execute()
items = response['items']
assert len(items) == len(ids)
for item in items:
stat = item['statistics']
stats.append(
Stat(
video_id = item['id'],view_count = stat['viewCount'],like_count = stat['likeCount']
)
)
请注意,在列表videos
的长度为N
的情况下,以上代码将对Videos.list
的呼叫次数从N
减少到math.floor(N / 50) + (1 if N % 50 else 0)
。这是因为可以将Videos.list
端点的参数id
指定为以逗号分隔的视频ID列表(其中一个ID列表的最大数目为50)。
还要注意,上面的每段代码都使用fields
请求参数来从调用的API端点中仅获取实际使用的信息。
我还必须提到,根据YouTube's staff,对于通过PlaylistItems.list
端点返回的项目数,设计有一个20000的上限。这很不幸,但这是事实。