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.listAPI用于获取该播放列表的所有视频 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 的上限。这是不幸的,但却是事实。