0

0

如何用 Java Jsoup 抓取 YouTube 评论?答案是:无法直接实现

心靈之曲

心靈之曲

发布时间:2026-02-19 13:46:06

|

811人浏览过

|

来源于php中文网

原创

如何用 Java Jsoup 抓取 YouTube 评论?答案是:无法直接实现

jsoup 无法抓取 youtube 评论,因其评论内容由 javascript 动态加载,而 jsoup 仅解析静态 html 源码;本文将清晰解释原理、验证方法、替代方案,并提供可运行的验证代码与专业建议。

jsoup 无法抓取 youtube 评论,因其评论内容由 javascript 动态加载,而 jsoup 仅解析静态 html 源码;本文将清晰解释原理、验证方法、替代方案,并提供可运行的验证代码与专业建议。

YouTube 的评论区采用典型的 客户端动态渲染(Client-Side Rendering) 架构:初始 HTML 响应中不包含任何实际评论节点,所有评论均由 JavaScript(通过 XHR 或 gRPC-Web)在用户滚动至评论区域后异步加载并注入 DOM。而 Jsoup 是一个 纯服务端 HTML 解析器,它仅获取并解析服务器返回的原始 HTML 字符串,完全不执行 JavaScript,因此永远无法访问动态生成的内容。

? 验证:对比“页面源代码”与“开发者工具”视图

这是理解问题的关键一步。请执行以下操作:

  1. 在浏览器中打开任意 YouTube 视频页(如 https://www.youtube.com/watch?v=C33Rw0AA3aU);
  2. 右键 → “查看网页源代码”(或地址栏输入 view-source:https://www.youtube.com/watch?v=C33Rw0AA3aU);
  3. 搜索 ytd-comment-renderer 或 yt-formatted-string —— 结果为空
  4. 再次打开该页面,按 F12 打开开发者工具(Elements 标签页),向下滚动触发评论加载;
  5. 此时搜索相同关键词 —— 元素成功出现

这明确证明:评论存在于运行时 DOM,但不在原始 HTML 源码中,Jsoup 读取的正是第 3 步的源码。

⚠️ 为什么你的代码返回空列表?

你当前的 CSS 选择器逻辑本身无误(语法层面),但目标元素根本不存在于 Jsoup 获取的文档中:

立即学习Java免费学习笔记(深入)”;

// ❌ 无效:这些元素在原始 HTML 中不存在
Elements comments = page.select("yt-formatted-string[class=style-scope ytd-comment-renderer]");
Elements authors = page.select("span[class= style-scope ytd-comment-renderer]"); // 注意 class 值前多余空格

此外,第二个选择器还存在格式错误:class= style-scope... 中等号后多了一个空格,导致 CSS 选择器语法非法(Jsoup 会静默忽略该规则)。

超会AI
超会AI

AI驱动的爆款内容制造机

下载

✅ 替代方案:技术选型建议

若你坚持需从 YouTube 抓取评论,请根据场景选择合适方案:

方案 原理 适用性 备注
YouTube Data API v3 官方 REST API,需申请 API Key ✅ 推荐首选 免费配额充足(10,000 单位/天),支持分页、过滤、排序;返回结构化 JSON;需遵守 Terms of Service
Headless 浏览器(如 Selenium + ChromeDriver) 启动真实浏览器,执行 JS 渲染后抓取 DOM ⚠️ 学习成本高、性能低、易被反爬 适合教学演示或小规模实验,不推荐生产环境
逆向 YouTube Web API(非官方) 分析浏览器 Network 请求,模拟 POST /youtubei/v1/comments/comment_threads ❌ 高风险、不稳定、违反 ToS 接口频繁变更,需处理签名、token、协议缓冲区(Protobuf)解码,法律与维护成本极高

? 强烈建议初学者放弃 YouTube 作为 Jsoup 练习目标。它不是“不适合 Jsoup”,而是刻意设计为 Jsoup 不可用——这恰恰是学习前端渲染机制与网络请求模型的绝佳反例。

? 教学验证代码:用 Jsoup 确认“无评论源码”

以下代码可帮助你实证上述结论,增强对服务端渲染局限性的理解:

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

public class YoutubeStaticHtmlCheck {
    public static void main(String[] args) throws Exception {
        String url = "https://www.youtube.com/watch?v=C33Rw0AA3aU";
        Document doc = Jsoup.connect(url)
                .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36")
                .timeout(10000)
                .get();

        // 检查关键评论容器是否存在
        Elements commentRenderers = doc.select("ytd-comment-renderer");
        System.out.println("【静态 HTML 中】ytd-comment-renderer 元素数量: " + commentRenderers.size());

        // 检查是否含已知评论文本特征(如“赞”“回复”等中文)
        String html = doc.body().html();
        boolean hasCommentText = html.contains("赞") || html.contains("回复") || html.contains("条评论");
        System.out.println("【静态 HTML 中】是否含常见评论文本: " + hasCommentText);

        // 输出前 500 字节 HTML 片段(确认无动态内容)
        System.out.println("\n【HTML 片段摘要】:\n" + html.substring(0, Math.min(500, html.length())) + "...");
    }
}

运行结果将稳定输出:

【静态 HTML 中】ytd-comment-renderer 元素数量: 0
【静态 HTML 中】是否含常见评论文本: false

✅ 推荐 Jsoup 入门练习网站(安全、合法、静态)

为高效掌握 Jsoup,建议切换至以下服务端渲染(SSR) 网站实践:

示例(抓取 httpbin 标题与段落):

Document doc = Jsoup.connect("https://www.php.cn/link/1536687004241eb9faeee0e227b58c60").get();
String title = doc.select("title").text(); // "Herman Melville - Moby Dick"
Elements paragraphs = doc.select("body p");
System.out.println("共 " + paragraphs.size() + " 段文字");

? 总结

  • 核心结论:Jsoup ≠ 浏览器,它无法执行 JavaScript,因此绝对无法抓取 YouTube 动态评论;这不是代码 bug,而是技术边界限制。
  • 学习价值:此问题深刻揭示了现代 Web 架构中 SSR vs CSR 的本质差异,是前端与爬虫工程师的必修认知。
  • 行动建议:初学者请立即转向 YouTube Data API 或静态网站练习 Jsoup;进阶者再研究 Puppeteer/Selenium 或协议逆向——但务必遵守法律法规与平台条款。
  • 工程原则:永远优先使用官方 API;爬虫应尊重 robots.txt、设置合理 User-Agent 与请求间隔,避免对目标服务造成负担。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

442

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

544

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

322

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

81

2025.09.10

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

770

2023.08.02

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6400

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

836

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

1086

2023.12.21

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

660

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.7万人学习

C# 教程
C# 教程

共94课时 | 9.8万人学习

Java 教程
Java 教程

共578课时 | 68.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号