youtube api v3页面令牌

Rad*_*tta 5 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());
}}
Run Code Online (Sandbox Code Playgroud)

输出是

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
Run Code Online (Sandbox Code Playgroud)

在遍历while循环10次迭代之后,它会退出,因为下一页令牌为空.

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

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

jlm*_*ald 22

你正在经历着预期的事情; 使用nextPageToken,您最多只能获得500个结果.如果您对如何开发感兴趣,可以通读这个帖子:

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

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

让我想到这一点的一件事是要意识到,当YouTube谈论搜索时,他们谈论的是概率而不是匹配,所以结果是根据你的参数,根据它们与之相关的可能性来排序的.您的查询.当你分页时,你最终会达到这样的程度,从统计学上讲,相关概率足够低,以至于让那些结果回来是不值得的.所以500是决定限制.

(另请注意,"结果"的数量不是匹配的近似值,它是潜在匹配的近似值,但是当您开始检索它们时,许多可能的匹配会被抛弃,因为根本不相关...所以这个数字并不能真正意味着人们的想法.谷歌搜索是一样的.)

你可能想知道为什么YouTube搜索以这种方式运行而不是做更传统的字符串/数据匹配; 如果搜索量如此之多,如果他们实际上对每个查询的所有数据进行了完整搜索,那么如果不是更多的话,你每次都要等待几分钟.如果您考虑一下,这真的是一个技术奇迹,当算法在预测,概率等方面运行时,算法如何能够获得前500个案例的相关结果.

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