YouTube 数据 API V3 - 频道 ID 的最大搜索结果
YouTube Data API V3 - Maximum search result for Channel ID
我看到了关于 Search API 的 API 参考文档:
Note: Search results are constrained to a maximum of 500 videos if your request specifies a value for the channelId
parameter and sets the type
parameter value to video
, [...].
我是否必须申请付费帐户才能突破 500 个视频的限制?如果是,我该如何申请?
如果您需要获取给定频道的所有视频的列表——由其 ID 标识,比如 CHANNEL_ID
——,那么您必须按以下步骤进行:
第一步:查询Channels.list
API endpoint with parameter id=CHANNEL_ID
for to obtain from the 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/
关联。
第2步:使用之前获取的uploads playlist ID--我们命名为UPLOADS_ID
--查询PlaylistItems.list
API用于获取该播放列表的所有视频 ID 列表的端点:
is_video = lambda item: \
item['snippet']['resourceId']['kind'] == 'youtube#video'
video_id = lambda item: \
item['snippet']['resourceId']['videoId']
request = youtube.playlistItems().list(
playlistId = UPLOADS_ID,
part = 'snippet',
fields = 'nextPageToken,items(snippet(resourceId))',
maxResults = 50
)
videos = []
while request:
response = request.execute()
items = response.get('items', [])
videos.extend(map(video_id, filter(is_video, items)))
request = youtube.playlistItems().list_next(
request, response)
在 运行 执行上述代码后,列表 videos
将包含在 CHANNEL_ID
标识的频道上上传的所有视频的 ID。
第 3 步:查询您感兴趣的每个视频的 Videos.list
API endpoint for to obtain the 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
可以指定为 comma-separated 视频 ID 列表(一个这样的列表中的 ID 数量最多可以有 50 个)。
另请注意,上面的每段代码都使用 fields
请求参数从调用的 API 端点仅获取实际使用的信息。
我还必须提到,根据 YouTube's staff,设计 为通过 PlaylistItems.list
端点返回的项目数设置了 20000 的上限。这是不幸的,但却是事实。
我看到了关于 Search API 的 API 参考文档:
Note: Search results are constrained to a maximum of 500 videos if your request specifies a value for the
channelId
parameter and sets thetype
parameter value tovideo
, [...].
我是否必须申请付费帐户才能突破 500 个视频的限制?如果是,我该如何申请?
如果您需要获取给定频道的所有视频的列表——由其 ID 标识,比如 CHANNEL_ID
——,那么您必须按以下步骤进行:
第一步:查询Channels.list
API endpoint with parameter id=CHANNEL_ID
for to obtain from the 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/
关联。
第2步:使用之前获取的uploads playlist ID--我们命名为UPLOADS_ID
--查询PlaylistItems.list
API用于获取该播放列表的所有视频 ID 列表的端点:
is_video = lambda item: \
item['snippet']['resourceId']['kind'] == 'youtube#video'
video_id = lambda item: \
item['snippet']['resourceId']['videoId']
request = youtube.playlistItems().list(
playlistId = UPLOADS_ID,
part = 'snippet',
fields = 'nextPageToken,items(snippet(resourceId))',
maxResults = 50
)
videos = []
while request:
response = request.execute()
items = response.get('items', [])
videos.extend(map(video_id, filter(is_video, items)))
request = youtube.playlistItems().list_next(
request, response)
在 运行 执行上述代码后,列表 videos
将包含在 CHANNEL_ID
标识的频道上上传的所有视频的 ID。
第 3 步:查询您感兴趣的每个视频的 Videos.list
API endpoint for to obtain the 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
可以指定为 comma-separated 视频 ID 列表(一个这样的列表中的 ID 数量最多可以有 50 个)。
另请注意,上面的每段代码都使用 fields
请求参数从调用的 API 端点仅获取实际使用的信息。
我还必须提到,根据 YouTube's staff,设计 为通过 PlaylistItems.list
端点返回的项目数设置了 20000 的上限。这是不幸的,但却是事实。