【问题标题】:How does Pagination work in YouTube API (apiclient.discovery)?分页在 YouTube API (apiclient.discovery) 中如何工作?
【发布时间】:2022-01-11 10:03:56
【问题描述】:

我对使用 YouTube API 很陌生,我正在寻找一种方法来收集大量频道数据。但是,API 限制为每个请求 50 个结果。为了获得更多结果,它允许您使用分页。当我查询结果时,我得到以下标记:

'nextPageToken': 'CDIQAA'

此令牌可用于查询下一组结果。因此,它允许我转到第 2 页并在那里获得新的结果。但是,当我进入第 2 页时,此令牌值会发生变化。这导致了以下问题:

如何使用页面标记/分页来获得所有可能的结果?

我知道这个查询会给出很多结果,我需要过滤更多;)

from apiclient.discovery import build


api_key = "My_key"

youtube = build('youtube','v3',developerKey = api_key)
print(type(youtube))

request = youtube.search().list(
    q='Fishing',
    part='snippet',
    type='channel',
    maxResults=50
)
print(type(request))
res = request.execute()
print(res)

for item in res['items']:
    print(item['snippet']['title'])

【问题讨论】:

    标签: python google-api youtube-api youtube-data-api google-api-client


    【解决方案1】:

    我相信你的目标如下。

    • 您想使用pageTokenyoutube.search().list(q = 'A query', part = 'id,snippet', type = 'video', maxResults = 50, relevanceLanguage = 'en', videoDuration = 'long') 检索数据。

    这样的话,下面的修改怎么样?

    修改脚本:

    from apiclient.discovery import build
    
    
    api_key = "My_key"
    
    youtube = build('youtube', 'v3', developerKey=api_key)
    
    data = []
    pageToken = ""
    while True:
        res = youtube.search().list(
            q='Fishing',
            part='snippet',
            type='channel',
            maxResults=50,
            pageToken=pageToken if pageToken != "" else ""
        ).execute()
        v = res.get('items', [])
        if v:
            data.extend(v)
        pageToken = res.get('nextPageToken')
        if not pageToken:
            break
    
    # print(len(data)) # You can check the number of retrieved data.
    
    for item in data:
        print(item['snippet']['title'])
    

    参考:

    【讨论】:

    • 就是这样!我刚刚根据您的查询检索了 500 多个频道!如果我是正确的,它会检查是否有 pageToken。如果有,则转到下一页。为什么我们对列表使用 .extend 而不是 .append? :)
    • @Jorginton 感谢您的回复。我很高兴你的问题得到了解决。关于Why do we use .extend for the list and not .append? 的附加问题,res.get('items', []) 的值类似于[,,,]。在此脚本中,检索到的值被放入一维数组中。所以我使用了extend。如果我的解释没有用,我深表歉意。
    【解决方案2】:

    您可以将一个名为 pageToken 的参数与您的请求一起发送。文档implementation/pagination 中对此有一些介绍,但不多。

    request = youtube.search().list(
        q='Fishing',
        part='snippet',
        type='channel',
        pageToken='tokenFromPrevousCall',
        maxResults=50
    )
    

    诀窍是将其添加到循环中并递归执行。它接缝客户端库可能有一些可以帮助docs/pagination

    request = youtube.search().list(
       q = 'A query',
       part = 'id,snippet',
       type = 'video',
       maxResults = 50,
       relevanceLanguage = 'en',
       videoDuration = 'long'
    )
    
    while request:
       response = request.execute()
    
    for item in response['items']:
       ...
    
       request = youtube.search().list_next(
          request, response)  // Get next set of results
    

    【讨论】:

    • 感谢您的评论!我已经阅读并查看了文档。但是,这听起来可能很愚蠢,但我(还)不明白。如何从之前的通话中获取令牌?而且,我将如何在上面的示例中包含它。您不必为我完全写出来,但我正在努力掌握这个概念! :)
    • 检查客户端库中的链接 request = youtube.search().list_next(request, response) 应该为您完成所有工作。
    • 啊,您的编辑解决了很多困惑。但我注意到您没有在脚本中使用pagetoken。此外,运行它时,它会消耗我所有的每日配额:在另一个 Google 帐户上创建新的 API 密钥后,我得到以下信息:The request cannot be completed because you have exceeded your <a href="/youtube/v3/getting-started#quota">quota</a>."
    • 问题是我不是 python 开发人员,我只是从示例中获取代码:)。分页会吃掉你为每个请求收取的配额,甚至是下一页。
    • 别担心,你帮助我理解了这个概念! :)
    猜你喜欢
    • 2023-03-29
    • 1970-01-01
    • 2021-04-01
    • 2011-06-28
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多