You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Java Jsoup爬取YouTube评论及评论者名称遇空列表求助

问题描述

我正在学习Java Jsoup,想要爬取YouTube视频的评论内容及评论者名称。选取了一个任意YouTube视频并查看了目标元素,也参考了Jsoup选择器语法文档及相关Stack Overflow问题,但仍不理解选择器语法的使用。目前代码输出两个空列表,期望得到分别存储评论和评论者名称的非空列表,恳请帮助!

以下是我的代码:

import java.io.IOException;
import java.util.ArrayList;
import org.jsoup.Jsoup;  
import org.jsoup.nodes.Document;  
import org.jsoup.nodes.Element;  
import org.jsoup.select.Elements;  

public class FirstJsoupExample {

    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
    
        Document page = Jsoup.connect("https://www.youtube.com/watch?v=C33Rw0AA3aU").get();
        
        // Comments
        Elements Comments = page.select("yt-formatted-string[class=style-scope ytd-comment-renderer]");
        ArrayList<String> CommentsList = new ArrayList<String>(); 
        for (Element comment : Comments) {
            CommentsList.add("Comment: " + comment.text());
        }
        
        // Commentators
        Elements Comentators = page.select("span[class= style-scope ytd-comment-renderer]");
        ArrayList<String> ComentatorList = new ArrayList<String>(); 
        for (Element comentator : Comentators) {
            ComentatorList.add("Comentator: " + comentator.text());
        }       
        
        
        System.out.println(ComentatorList);
        System.out.println(CommentsList);
            
        
        
    }

}
解决方案

核心原因:动态内容加载限制

YouTube的评论数据不会直接嵌入初始HTML页面,而是通过JavaScript在页面加载完成后动态请求并渲染。Jsoup只能抓取服务器返回的静态HTML源码,无法执行JavaScript解析动态内容,这是导致空列表的核心原因。

代码中的其他问题

  1. 选择器不精准:
    • 评论内容选择器yt-formatted-string[class=style-scope ytd-comment-renderer]范围太广,即使静态页面存在该元素,也并非目标评论内容;动态加载后的评论元素有更具体的层级结构。
    • 评论者名称选择器span[class= style-scope ytd-comment-renderer]多了前置空格,class属性值无此空格,且同样范围宽泛。
  2. 拼写错误:变量名Comentators、ComentatorList、comentator均拼写错误,正确应为Commentators、CommentatorList、commentator。

可行解决路径

  1. 官方API调用:使用YouTube Data API是合法且稳定的方案,可直接获取结构化的评论数据,无需处理动态加载问题。
  2. 模拟浏览器渲染:若坚持用Java实现,可结合Selenium工具模拟浏览器加载页面,等待评论渲染完成后再抓取源码解析。示例代码如下:
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;

public class YouTubeCommentScraper {
    public static void main(String[] args) {
        // 配置ChromeDriver路径(需替换为本地实际路径)
        System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");
        WebDriver driver = new ChromeDriver();
        driver.get("https://www.youtube.com/watch?v=C33Rw0AA3aU");
        
        // 等待评论加载完成,可根据网络情况调整时长
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        
        // 获取渲染后的页面源码
        String pageSource = driver.getPageSource();
        Document doc = Jsoup.parse(pageSource);
        
        // 解析评论内容(精准选择器)
        Elements commentElements = doc.select("ytd-comment-renderer #content-text");
        ArrayList<String> commentList = new ArrayList<>();
        for (Element elem : commentElements) {
            commentList.add("Comment: " + elem.text());
        }
        
        // 解析评论者名称(精准选择器)
        Elements commentatorElements = doc.select("ytd-comment-renderer #author-text span");
        ArrayList<String> commentatorList = new ArrayList<>();
        for (Element elem : commentatorElements) {
            commentatorList.add("Commentator: " + elem.text());
        }
        
        // 输出结果
        System.out.println(commentatorList);
        System.out.println(commentList);
        
        // 关闭浏览器
        driver.quit();
    }
}

内容的提问来源于stack exchange,提问作者Robbie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 09:45:26