YouTube Data API V3-频道ID的最大搜索结果

问题描述

我遇到了有关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的上限。这很不幸,但这是事实。