查看 YouTube 视频的所有评论
Posted
技术标签:
【中文标题】查看 YouTube 视频的所有评论【英文标题】:View all comments on a YouTube video 【发布时间】:2016-05-28 05:39:42 【问题描述】:我正在尝试使用 Java 程序获取 YouTube 视频中的所有 cmets。我无法得到它们,因为它有“显示更多”而不是所有的 cmets。我正在寻找一种方法来获取我可以通过的所有 cmets 或 cmets 页面。我有视频 ID 和东西,只需要 cmets。
我尝试了 all_cmets 而不是在 URL 中观看,但它仍然没有显示所有 cmets 并重定向到再次观看。
我还查看了 YouTube api,只能找到如何使用他们的 id 获取 cmets,但我需要从视频 id 获取所有 cmets。
如果有人知道怎么做,请告诉我。
我已经增加了 50 代表的赏金,谁可以给我一个好的答案。
【问题讨论】:
有趣的我也期待答案 嗯。如果 6 小时内没有得到答复,我将悬赏。 我不介意,只要有人回答,我关心的就是。 赏金现已添加! developers.google.com/youtube/v3/docs/comments/list 检查总页数。编写循环并进行增量调用 【参考方案1】:您需要为您的视频获取评论线程列表请求,然后使用上次响应中的下一页令牌向前滚动:
private static int counter = 0;
private static YouTube youtube;
public static void main(String[] args) throws Exception
// For Auth details consider:
// https://github.com/youtube/api-samples/blob/master/java/src/main/java/com/google/api/services/samples/youtube/cmdline/Auth.java
// Also don't forget secrets https://github.com/youtube/api-samples/blob/master/java/src/main/resources/client_secrets.json
List<String> scopes = Lists.newArrayList("https://www.googleapis.com/auth/youtube.force-ssl");
Credential credential = Auth.authorize(scopes, "commentthreads");
youtube = new YouTube.Builder(Auth.HTTP_TRANSPORT, Auth.JSON_FACTORY, credential).build();
String videoId = "video_id";
// Get video comments threads
CommentThreadListResponse commentsPage = prepareListRequest(videoId).execute();
while (true)
handleCommentsThreads(commentsPage.getItems());
String nextPageToken = commentsPage.getNextPageToken();
if (nextPageToken == null)
break;
// Get next page of video comments threads
commentsPage = prepareListRequest(videoId).setPageToken(nextPageToken).execute();
System.out.println("Total: " + counter);
private static YouTube.CommentThreads.List prepareListRequest(String videoId) throws Exception
return youtube.commentThreads()
.list("snippet,replies")
.setVideoId(videoId)
.setMaxResults(100L)
.setModerationStatus("published")
.setTextFormat("plainText");
private static void handleCommentsThreads(List<CommentThread> commentThreads)
for (CommentThread commentThread : commentThreads)
List<Comment> comments = Lists.newArrayList();
comments.add(commentThread.getSnippet().getTopLevelComment());
CommentThreadReplies replies = commentThread.getReplies();
if (replies != null)
comments.addAll(replies.getComments());
System.out.println("Found " + comments.size() + " comments.");
// Do your comments logic here
counter += comments.size();
如果您需要示例骨架项目,请考虑 api-samples。
更新
无法获得所有cmets的情况也可能是quota limits造成的(至少我遇到过):
单位/天 50,000,000 单位/100 秒/用户 300,000这不是 java、python、js 或任何语言特定的规则。如果你想超过配额,你不能尝试apply for higher quota。不过,我将从控制您的吞吐量开始。超过 100 秒/用户 配额非常容易。
【讨论】:
使用这种方法可以抓取的 cmets 数量没有限制吗?我怀疑 您可以使用“.setMaxResults()”限制页面大小。这是他们 api 的一部分,所以你也可以在 python 客户端中使用它。 我的意思是如果一个视频有 100 万个 cmets,这可以全部下载吗?我看到某处 api 不支持这个 它使用与您相同的 api,但来自 java。我认为这些限制是由配额引起的。我会把它添加到我的答案中。 谢谢,这正是我所需要的,谢谢,但要详细说明限制以及如何申请更高的限制。非常感激。你得到了赏金:)【参考方案2】:试试这个,它可以下载我测试过的给定视频的所有 cmets。
https://github.com/egbertbouman/youtube-comment-downloader
python downloader.py --youtubeid YcZkCnPs45s --output OUT
Downloading Youtube comments for video: YcZkCnPs45s
Downloaded 1170 comment(s)
Done!
输出为 JSON 格式:
"text": "+Tony Northrup many thanks for the prompt reply - I'll try that.",
"time": "1 day ago",
"cid": "z13nfbog0ovqyntk322txzjamuensvpch.1455717946638546"
【讨论】:
是的,一个工作!而且也没有 YouTube API 凭据和配额限制 :-) 虽然我得到这样的德语元值有点有趣:"text": "Mega Madness\ufeff", "time": "vor 1 Woche" , "作者": "Jessica Fischer", "cid": "z135hboyasa2j1rgy04cgdrwxmunhdvajqg0k" 但是随着要下载的 cmets 数量的增加,这个脚本变得非常慢。 YT API 更快。 @samsamara 如果可能的话,我希望你能用java重写它,或者给我一些建议,以便我用java重新创建它。 @VũĐạt 我不是那个脚本的作者。随着 cmets 数量的增加,它变得超级慢。你有什么理由不能使用 YT API?我已经求助于使用 YT API,因为这个脚本太慢了以上是关于查看 YouTube 视频的所有评论的主要内容,如果未能解决你的问题,请参考以下文章