分页在 YouTube API (apiclient.discovery) 中如何工作?

How does Pagination work in YouTube API (apiclient.discovery)?

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

'nextPageToken': 'CDIQAA'

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

如何使用页面 token/pagination 获得所有可能的结果?

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

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'])

有一个名为 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

我相信你的目标如下。

  • 您想使用 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'])

参考: