我的目标是从播放列表中提取所有视频,该列表可以包含许多视频,大约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。
尝试以这种方式等待一段时间:
import time
time.sleep(1) # time here in seconds
为了获得给定频道的liked个视频的完整列表而没有任何遗漏,我建议您改用PlaylistItems endpoint,通过传递适当的值来查询给定频道的liked-videos播放列表端点的playlistId参数。
在查询channel's own endpoint时获得给定频道的喜欢的视频播放列表ID。所需的ID位于.items.contentDetails.relatedPlaylists.likes
。