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