youtube api v3 页面 token

标签 youtube youtube-api

我正在使用搜索 api 并使用 nextpagetoken 对结果进行分页。
但我无法以这种方式检索所有结果。我只能从大约 455000 个结果中获得 500 个结果。

这是获取搜索结果的java代码:

youtube = new YouTube.Builder(Auth.HTTP_TRANSPORT, Auth.JSON_FACTORY, new HttpRequestInitializer() {public void initialize(HttpRequest request) throws IOException {}           }).setApplicationName("youtube-search").build();

YouTube.Search.List search = youtube.search().list("id,snippet");
String apiKey = properties.getProperty("youtube.apikey");
search.setKey(apiKey);
search.setType("video");
search.setMaxResults(50);
search.setQ(queryTerm);
boolean allResultsRead = false;
while (! allResultsRead){
SearchListResponse searchResponse = search.execute();
System.out.println("Printed " +  searchResponse.getPageInfo().getResultsPerPage() + " out of " + searchResponse.getPageInfo().getTotalResults() + ". Current page token: " + search.getPageToken() + "Next page token: " + searchResponse.getNextPageToken() + ". Prev page token" + searchResponse.getPrevPageToken());
if (searchResponse.getNextPageToken() == null)
{
    allResultsRead = true;                          
    search = youtube.search().list("id,snippet");
    search.setKey(apiKey);
    search.setType("video");
    search.setMaxResults(50);
}
else
{
   search.setPageToken(searchResponse.getNextPageToken());
}}

输出是
Printed 50 out of 455085. Current page token: null Next page token: CDIQAA. Prev page token null
Printed 50 out of 454983. Current page token: CDIQAA Next page token: CGQQAA. Prev page token CDIQAQ
Printed 50 out of 455081. Current page token: CGQQAA Next page token: CJYBEAA. Prev page token CGQQAQ
Printed 50 out of 454981. Current page token: CJYBEAA Next page token: CMgBEAA. Prev page token CJYBEAE
Printed 50 out of 455081. Current page token: CMgBEAA Next page token: CPoBEAA. Prev page token CMgBEAE
Printed 50 out of 454981. Current page token: CPoBEAA Next page token: CKwCEAA. Prev page token CPoBEAE
Printed 50 out of 455081. Current page token: CKwCEAA Next page token: CN4CEAA. Prev page token CKwCEAE
Printed 50 out of 454980. Current page token: CN4CEAA Next page token: CJADEAA. Prev page token CN4CEAE
Printed 50 out of 455081. Current page token: CJADEAA Next page token: CMIDEAA. Prev page token CJADEAE
Printed 50 out of 455081. Current page token: CMIDEAA Next page token: null. Prev page token CMIDEAE

通过 while 循环 10 次迭代后,它退出,因为下一页标记为空。

我是 Yotube API 的新手,不确定我在这里做错了什么。我有两个问题:
1. 我如何获得所有结果?
2. 为什么第 3 页的上一页 token 与第 2 页的当前 token 不相同?

任何帮助将不胜感激。谢谢!

最佳答案

你正在体验预期的东西;使用 nextPageToken,最多只能得到 500 个结果。如果您对这是如何发生的发展感兴趣,您可以阅读以下主题:

https://code.google.com/p/gdata-issues/issues/detail?id=4282

但作为该主题的总结,它基本上归结为这样一个事实,即 YouTube 上有如此多的数据,搜索算法与大多数人认为的完全不同。这不仅仅是在字段中进行简单的数据库搜索,而且正在处理数量惊人的信号以使结果相关,并且在大约 500 个结果之后,算法开始失去使结果有值(value)的能力.

帮助我解决这个问题的一件事是意识到当 YouTube 谈论搜索时,他们谈论的是概率而不是匹配您的查询。然后,当您进行分页时,您最终会达到一个点,从统计上讲,相关性的概率足够低,以至于在计算上不值得让这些结果回来。所以 500 是决定的限制。

(另请注意,“结果”的数量不是匹配的近似值,而是潜在匹配的近似值,但是当您开始检索它们时,许多可能的匹配被丢弃,因为根本不相关......所以这个数字并不真正意味着人们认为它的作用。谷歌搜索也是如此。)

您可能想知道为什么 YouTube 搜索以这种方式运行,而不是进行更传统的字符串/数据匹配;有如此多的搜索量,如果他们真的要对每个查询的所有数据进行完整的搜索,那么您一次要等待几分钟,甚至更多。这真的是一个技术奇迹,如果你仔细想想,当算法在预测、概率等方面发挥作用时,它们如何能够为前 500 个案例获得如此相关的结果。

至于您的第二个问题,页面标记不代表一组唯一的结果,而是代表一种算法状态,因此是指向您的查询、查询进度和查询方向的指针......因此,例如,迭代 3 被迭代 2 的 nextPageToken 和迭代 4 的 prevPageToken 引用,但这两个标记略有不同,因此它们可以指示它们来自的方向。

关于youtube api v3 页面 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25918405/

相关文章:

javascript - YouTube 数据 API : check if a video has the ratings enabled

ruby-on-rails - 从 Ruby on Rails 应用程序上传视频到 youtube

asp.net - 如何显示带有广告和跳过按钮功能的youtube视频?

android - 在 webview 中播放 youtube 视频并且 webview 正在使用时,“如果播放没有立即开始,请尝试重新启动您的设备”

html - 在深色播放器中嵌入YouTube视频?

html - 在 android 中自动播放 youtube 视频

javascript - 在 document.ready 中添加 youtube iframe 代码时出现问题

c# - 如何使用.net youtube API直接上传获取上传状态

youtube-api - 使用googleapis包结束后如何隐藏YouTube视频?

javascript - 在 JavaScript/Node.js 中将 Youtube Data API V3 视频持续时间格式转换为秒