You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的响应。
  • 接口硬上限约束:YouTube搜索接口不管如何翻页,最多只会返回匹配条件的前1000条结果,超过阈值的内容不会通过搜索接口透出,不过你当前仅返回7条结果,还未触发这个上限。
优化方向
  • 统一所有分页请求的筛选参数,首次请求和后续带token的请求必须保持publishedAfter、publishedBefore、location、locationRadius等所有筛选条件完全一致,禁止中途修改参数。
  • 适当扩大检索半径,建议把locationRadius调整为5km~10km,匹配机场实际覆盖范围。
  • 将maxResults调整为接口允许的最大值50,减少分页请求次数,降低触发频控截断的概率。
  • 提前明确预期:不存在能拉取全量机场相关视频的方案,没有公开精确GPS标签的视频,永远无法通过地理检索条件获取。

内容的提问来源于stack exchange,提问作者Andreas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 16:15:11