使用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解析动态内容,这是导致空列表的核心原因。
代码中的其他问题
- 选择器不精准:
- 评论内容选择器
yt-formatted-string[class=style-scope ytd-comment-renderer]范围太广,即使静态页面存在该元素,也并非目标评论内容;动态加载后的评论元素有更具体的层级结构。 - 评论者名称选择器
span[class= style-scope ytd-comment-renderer]多了前置空格,class属性值无此空格,且同样范围宽泛。
- 评论内容选择器
- 拼写错误:变量名
Comentators、ComentatorList、comentator均拼写错误,正确应为Commentators、CommentatorList、commentator。
可行解决路径
- 官方API调用:使用YouTube Data API是合法且稳定的方案,可直接获取结构化的评论数据,无需处理动态加载问题。
- 模拟浏览器渲染:若坚持用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
相关产品推荐
相关产品推荐

