Python调用YouTube API v3使用nextPageToken无法获取全量搜索结果
问题描述
检索2012年发布、地理位置位于阿姆斯特丹机场周边的YouTube视频时,接口仅返回7条结果,已知该位置2012年发布的相关YouTube视频实际数量远多于7条,无法获取全量结果,使用的实现代码如下:
# API client library import googleapiclient.discovery # API information api_service_name = "youtube" api_version = "v3" DEVELOPER_KEY = '' # API client youtube = googleapiclient.discovery.build( api_service_name, api_version, developerKey = DEVELOPER_KEY) # Notice that nextPageToken now is requested in 'fields' parameter NewPageToken = "" while True: if NewPageToken == "": print('request with no token') request = youtube.search().list( part="id,snippet", type='video', publishedAfter='2012-01-05T11:10:04Z', publishedBefore='2012-12-05T11:10:04Z', location="52.3076865, 4.767424099999971", locationRadius='1km', maxResults=1, fields="nextPageToken,items(id(videoId),snippet(publishedAt,channelId,channelTitle,title,description))" ) if NewPageToken != "": print('request with token') request = youtube.search().list( part="id,snippet", type='video', publishedAfter='2012-01-05T11:10:04Z', publishedBefore='2012-12-31T11:10:04Z', location="52.3076865, 4.767424099999971", locationRadius='1km', maxResults=1, fields="nextPageToken,items(id(videoId),snippet(publishedAt,channelId,channelTitle,title,description))", pageToken = NewPageToken ) response = request.execute() if "nextPageToken" in response: print('foundToken fetching next data') NewPageToken = response['nextPageToken'] else: print('noTokenFound Stopping your script') break print(response) # print(request)
结果不全的核心原因
- 接口本身的检索规则限制:YouTube Data API v3的
search.list接口做地理位置检索时,只会匹配上传时主动添加了公开精确GPS坐标标签的视频。你认为属于“阿姆斯特丹机场周边”的大量视频,要么上传时没开启位置标记,要么位置标记精度不足、被用户设为隐私,根本不会进入地理检索的返回池,这部分内容不可能通过地理搜索接口拿到。 - 代码存在逻辑错误,直接截断了返回结果:
- 分页请求的筛选条件不一致:首次无token请求的
publishedBefore参数设为2012-12-05T11:10:04Z,后续带分页token的请求却把这个参数改成了2012-12-31T11:10:04Z。分页token和生成它的查询条件是强绑定的,中途改筛选条件会导致token校验异常,直接终止分页。 - 地理检索范围设置过小:
locationRadius仅设为1km,阿姆斯特丹史基浦机场的实际占地范围远大于1km半径圈,大量机场范围内的视频坐标不在检索范围内。 - 单页返回条数设置不合理:
maxResults设为1,每次仅拉取1条结果,短时间内频繁发起分页请求很容易触发接口的频控和结果去重截断,提前返回无分页token的响应。
- 分页请求的筛选条件不一致:首次无token请求的
- 接口硬上限约束:YouTube搜索接口不管如何翻页,最多只会返回匹配条件的前1000条结果,超过阈值的内容不会通过搜索接口透出,不过你当前仅返回7条结果,还未触发这个上限。
优化方向
- 统一所有分页请求的筛选参数,首次请求和后续带token的请求必须保持
publishedAfter、publishedBefore、location、locationRadius等所有筛选条件完全一致,禁止中途修改参数。 - 适当扩大检索半径,建议把
locationRadius调整为5km~10km,匹配机场实际覆盖范围。 - 将
maxResults调整为接口允许的最大值50,减少分页请求次数,降低触发频控截断的概率。 - 提前明确预期:不存在能拉取全量机场相关视频的方案,没有公开精确GPS标签的视频,永远无法通过地理检索条件获取。
内容的提问来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

