如何从YouTube数据API v3检索大量数据(1000多个视频)?

时间:2019-05-31 05:37:23

标签: python api pagination youtube youtube-data-api

我的目标是从播放列表中提取所有视频,该播放列表可以包含大约3000个视频,并且可以包含5000个以上的视频。使用maxResults = 50并使用nextPageToken实现分页后,我只能调用API 20次,此后将不随响应发送nextPageToken

我正在从python应用程序调用API。我有一个while循环,一直运行到未发送nextPageToken为止,理想情况下,应该在提取所有视频之后进行,但是在调用API 19-20次后会过早退出

def main():
    youtube = get_authorised_youtube()  # returns YouTube resource authorized with OAuth.

    first_response = make_single_request(youtube, None)  # make_single_request() takes in the youtube resource and nextPageToken, if any.
    nextPageToken = first_response["nextPageToken"]

    try:
        count = 0
        while True:
            response = make_single_request(youtube, nextPageToken)
            nextPageToken = response["nextPageToken"]


            count += 1
            print(count, end=" ")
            print(nextPageToken)
    except KeyError as e:  # KeyError to catch if nextPageToken wasn't present
        response.pop("items")
        print(response)  # prints the last response for analysis


if __name__ == '__main__':
    main()

make_single_request()的摘要:

def make_single_request(youtube, nextPageToken):
    if nextPageToken is None:
        request = youtube.videos().list(
            part="id",
            myRating="like",
            maxResults=50
        )
    else:
        request = youtube.videos().list(
            part="id",
            myRating="like",
            pageToken=nextPageToken,
            maxResults=50
        )
    response = request.execute()

    return response

预计该代码最多可以进行50次API调用,但始终只能进行大约20次调用。

注意:以下代码是使用未付款的GCP帐户执行的。进行的呼叫具有part =“ id”,其配额成本为0。根据GCP的呼叫限制为:10,000。根据控制台上的配额,我只能赚20。

输出:

1 CGQQAA
2 CJYBEAA
3 CMgBEAA
4 CPoBEAA
5 CKwCEAA
6 CN4CEAA
7 CJADEAA
8 CMIDEAA
9 CPQDEAA
10 CKYEEAA
11 CNgEEAA
12 CIoFEAA
13 CLwFEAA
14 CO4FEAA
15 CKAGEAA
16 CNIGEAA
17 CIQHEAA
18 CLYHEAA
19 {'kind': 'youtube#videoListResponse', 'etag': '"ETAG"', 'prevPageToken': 'CLYHEAE', 'pageInfo': {'totalResults': TOTAL_RESULTS(>4000), 'resultsPerPage': 50}}

编辑:更改maxResults=20后,可以看到该代码调用了大约50个API,因此可以提取的视频总数恒定为1000。

2 个答案:

答案 0 :(得分:0)

尝试以这种方式等待一段时间:

import time
time.sleep(1) # time here in seconds

答案 1 :(得分:0)

要获得给定频道的喜欢个视频的完整列表而没有任何遗漏,建议您改用PlaylistItems endpoint,查询给定频道的喜欢的视频< / em>播放列表,方法是将适当的值传递给端点的 playlistId 参数。

查询channel's own endpoint后,即可获取给定频道的喜欢的视频播放列表ID 。所需的ID位于.items.contentDetails.relatedPlaylists.likes