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

问题描述 投票:0回答:2

我的目标是从播放列表中提取所有视频,该列表可以包含许多视频,大约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个API。

注意:以下代码是使用未付款的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。

python api pagination youtube youtube-data-api
2个回答
0
投票

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

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

0
投票

为了获得给定频道的liked个视频的完整列表而没有任何遗漏,我建议您改用PlaylistItems endpoint,通过传递适当的值来查询给定频道的liked-videos播放列表端点的playlistId参数。

在查询channel's own endpoint时获得

给定频道的喜欢的视频播放列表ID。所需的ID位于.items.contentDetails.relatedPlaylists.likes

© www.soinside.com 2019 - 2024. All rights reserved.