Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
Java Web Scraping:解析动态网页内容与官方API的最佳实践_创想鸟

Java Web Scraping:解析动态网页内容与官方API的最佳实践

Java Web Scraping:解析动态网页内容与官方API的最佳实践

当尝试使用`inputstream`和`bufferedreader`抓取youtube视频播放量等动态网页内容时,开发者常会遇到与浏览器“检查元素”所显示内容不符的问题。本教程旨在解释为何客户端javascript会改变页面内容,导致直接html解析失效,并强调利用官方api进行可靠数据提取的最佳实践,同时探讨浏览器自动化工具在此场景下的局限性。

理解动态网页内容的本质

现代Web应用,尤其是像YouTube这样内容丰富的平台,普遍采用客户端渲染技术。这意味着当您通过InputStream.openStream()获取一个URL的内容时,您收到的是服务器最初发送的原始HTML、CSS和JavaScript文件。然而,这仅仅是页面的骨架。许多关键内容,如视频播放量、评论区、推荐视频等,并不是直接包含在初始HTML中的。

这些动态内容通常通过以下方式生成:

JavaScript执行: 浏览器下载并执行页面中的JavaScript代码。API调用: JavaScript代码向后端API发起请求,获取JSON或其他格式的数据。DOM操作: JavaScript根据获取到的数据动态地创建、修改或删除HTML元素,并将其插入到页面的文档对象模型(DOM)中。

因此,您在浏览器中使用“检查元素”工具所看到的页面结构和内容,是JavaScript执行完毕并完成所有DOM操作后的最终状态。而InputStream读取到的,则是JavaScript执行前的原始HTML,两者之间存在显著差异。这就是为什么您无法在原始输入流中直接找到“896K views”这样的动态生成内容。

传统HTML解析的局限性

直接使用BufferedReader逐行读取原始HTML,然后尝试通过String.contains()等方法查找特定文本,在处理动态内容时几乎是无效的。因为您要查找的内容根本不在您读取的文本流中。

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

例如,原始代码中存在一个常见的读取错误:

      while(in.readLine() != null) // 第一次调用readLine(),读取并消费第一行      {        String s = (in.readLine()); // 第二次调用readLine(),读取并消费第二行        if(s!=null)        {          // ... 对第二行进行处理        }      }

这种写法会导致每次循环体内部实际处理的是跳过的一行,即每隔一行才处理一次。正确的读取方式应该是在循环条件中读取一行并赋值,然后在循环体内部使用该行数据:

      String line;      while((line = in.readLine()) != null) // 在条件中读取一行并赋值给line      {        // 在这里处理 line 变量        // 例如:code.add(line);        // ...      }

即使修正了读取逻辑,使其能够完整读取所有原始HTML内容,也无法解决核心问题:动态内容不在原始HTML中。您会得到大量的标签内容,其中包含用于构建页面的JavaScript逻辑,但并非最终的用户可见数据。

获取动态内容的推荐策略:官方API

对于从动态网站获取结构化数据,最推荐、最可靠、最稳定的方法是使用该网站提供的官方API(应用程序编程接口)。

以YouTube为例,Google提供了YouTube Data API。通过这个API,您可以:

获取视频信息: 包括播放量、点赞数、评论数、标题、描述等。搜索视频: 根据关键词、频道等条件搜索视频。管理播放列表: 创建、更新、删除播放列表。获取频道信息: 订阅者数量、上传视频列表等。

使用API的优势:

稿定抠图 稿定抠图

AI自动消除图片背景

稿定抠图 76 查看详情 稿定抠图 数据结构化: API通常返回JSON或XML格式的结构化数据,易于解析和处理。稳定性高: API是为程序化访问设计的,其接口相对稳定,不易受网站UI改动的影响。免维护: 您无需担心网站前端技术栈的变化,只需关注API文档即可。合规性: 使用官方API通常符合服务提供商的使用条款,避免潜在的法律风险。

实施API调用的基本步骤:

获取API密钥: 在Google Cloud Console中创建一个项目并启用YouTube Data API,然后生成API密钥。查阅API文档: 了解所需的API端点、请求参数和响应格式。发送HTTP请求: 使用Java的java.net.HttpURLConnection或更高级的HTTP客户端库(如Apache HttpClient, OkHttp)向API端点发送GET请求。解析响应: 将API返回的JSON/XML数据解析成Java对象,提取所需信息。

示例(概念性,非完整代码):

import java.io.BufferedReader;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;import com.google.gson.Gson; // 假设使用Gson库解析JSONpublic class YouTubeApiExample {    private static final String API_KEY = "YOUR_API_KEY"; // 替换为您的API密钥    private static final String VIDEO_ID = "9h5JC-GLR6g"; // YouTube视频ID    public static void main(String[] args) {        try {            String apiUrl = "https://www.googleapis.com/youtube/v3/videos?part=statistics&id=" + VIDEO_ID + "&key=" + API_KEY;            URL url = new URL(apiUrl);            HttpURLConnection connection = (HttpURLConnection) url.openConnection();            connection.setRequestMethod("GET");            int responseCode = connection.getResponseCode();            if (responseCode == HttpURLConnection.HTTP_OK) {                BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));                String inputLine;                StringBuilder response = new StringBuilder();                while ((inputLine = in.readLine()) != null) {                    response.append(inputLine);                }                in.close();                // 解析JSON响应                Gson gson = new Gson();                YouTubeApiResponse apiResponse = gson.fromJson(response.toString(), YouTubeApiResponse.class);                if (apiResponse != null && apiResponse.getItems() != null && !apiResponse.getItems().isEmpty()) {                    VideoItem video = apiResponse.getItems().get(0);                    System.out.println("视频标题: " + video.getSnippet().getTitle());                    System.out.println("播放量: " + video.getStatistics().getViewCount());                    System.out.println("点赞数: " + video.getStatistics().getLikeCount());                } else {                    System.out.println("未找到视频信息或API响应异常。");                }            } else {                System.out.println("API请求失败,响应码: " + responseCode);            }        } catch (Exception e) {            e.printStackTrace();        }    }    // 假设的YouTube API响应结构(需要根据实际API响应定义)    // 为了简化,这里只定义了部分字段    static class YouTubeApiResponse {        private java.util.List items;        public java.util.List getItems() { return items; }    }    static class VideoItem {        private Snippet snippet;        private Statistics statistics;        public Snippet getSnippet() { return snippet; }        public Statistics getStatistics() { return statistics; }    }    static class Snippet {        private String title;        public String getTitle() { return title; }    }    static class Statistics {        private String viewCount;        private String likeCount;        // ... 其他统计数据        public String getViewCount() { return viewCount; }        public String getLikeCount() { return likeCount; }    }}

替代方案:浏览器自动化工具(谨慎使用)

如果目标网站没有提供API,或者您确实需要模拟用户行为(例如点击按钮、填写表单),那么可以考虑使用浏览器自动化工具,如Selenium WebDriver。

Selenium的工作原理是启动一个真实的浏览器(可以是无头模式,即没有图形界面的浏览器),并通过程序控制它加载页面、执行JavaScript、等待元素加载,然后从渲染后的DOM中提取数据。

Selenium的优势:

获取完整DOM: 能够获取到所有JavaScript执行后的最终页面内容。模拟用户交互: 可以模拟点击、输入、滚动等操作。

Selenium的局限性(尤其不适用于简单数据抓取):

资源消耗大: 启动和运行一个浏览器实例需要大量的CPU、内存资源。对于大规模数据抓取,效率极低。速度慢: 浏览器加载和渲染页面需要时间,这比直接API调用或静态HTML解析慢得多。复杂性高: 需要处理浏览器驱动、元素定位、等待机制等复杂问题。维护成本高: 网站UI或前端技术栈的微小变动都可能导致您的选择器失效,需要频繁更新维护。并非为数据抓取设计: Selenium主要用于Web应用的自动化测试,将其用于大规模数据抓取通常不是最佳实践。

因此,除非您有非常特殊的需求,否则不建议将Selenium用于仅仅获取播放量这类可以通过API轻松获取的数据。

总结与最佳实践

在进行Web数据抓取时,理解网页内容的生成方式至关重要。

优先使用官方API: 对于像YouTube这样提供API的网站,始终首选使用其官方API。这不仅能提供最稳定、最结构化的数据,还能确保您的抓取行为符合服务条款。区分原始HTML与渲染DOM: 明确InputStream获取的是服务器原始响应,而“检查元素”显示的是JavaScript渲染后的DOM。避免直接解析动态内容: 对于由客户端JavaScript动态生成的内容,直接解析原始HTML是无效的。谨慎使用浏览器自动化工具: 仅在没有API且需要模拟复杂用户交互时考虑Selenium等工具,并充分评估其资源消耗和维护成本。

通过遵循这些最佳实践,您将能够更高效、更稳定地从Web获取所需数据,并避免在与动态网页交互时遇到的常见陷阱。

以上就是Java Web Scraping:解析动态网页内容与官方API的最佳实践的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1064679.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
苹果iPhone16全系列屏幕边框参数
上一篇 2025年12月2日 05:56:50
css grid在表单布局中的应用技巧
下一篇 2025年12月2日 05:56:55

相关推荐

  • 优化 Laravel Nova 动作响应消息的持久性与用户体验

    本文探讨了在 Laravel Nova 中处理长时任务后,默认动作响应消息(Toast)短暂显示的问题。针对这一挑战,我们将介绍如何利用 Laravel Nova 4 提供的 NovaNotification 功能,实现持久化的、带有交互操作的通知,从而显著提升用户体验,确保重要信息不会因消息瞬时消…

    2026年9月23日
    100
  • 如何使用Optuna优化AI大模型训练?自动化调参的详细教程

    如何使用Optuna优化AI大模型训练?自动化调参的详细教程如何使用Optuna优化AI大模型训练?自动化调参的详细教程如何使用Optuna优化AI大模型训练?自动化调参的详细教程如何使用Optuna优化AI大模型训练?自动化调参的详细教程

    Optuna通过智能搜索与剪枝机制,显著提升AI大模型超参数优化效率。它以目标函数封装训练流程,利用TPE等算法智能采样,结合ASHA等剪枝策略,在分布式环境下高效搜索最优配置,同时提供可复现性与可视化分析,降低调参成本。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 Dee…

    2026年9月23日 • 用户投稿
    000
  • Java SimpleDateFormat如何格式化日期

    SimpleDateFormat是java.text包中用于格式化和解析日期的类,继承自DateFormat,通过模式字符串定义日期格式,如yyyy表示四位年份、MM表示两位月份、dd表示日期、HH表示24小时制小时、mm表示分钟、ss表示秒、SSS表示毫秒、EEEE表示星期几全称、MMM表示月份缩…

    2026年9月23日
    000
  • windows8无法弹出usb设备怎么办_windows8安全移除U盘失败解决方法

    先重启Windows资源管理器,再依次排查占用进程、使用文件资源管理器弹出、确保Plug and Play服务运行、禁用USB选择性暂停、修复注册表通知项,可解决U盘无法安全移除问题。 如果您尝试从Windows 8电脑上安全移除U盘或其他USB设备,但系统提示设备正在使用中或没有任何反应,则可能是…

    2026年9月23日
    200
  • UC浏览器为什么会自动安装应用_UC浏览器自动安装应用解决方法

    首先关闭UC浏览器安装未知应用权限,再禁用其内部推广服务,接着清理缓存与下载记录,最后通过系统安全中心拦截静默安装行为,可有效阻止自动安装应用。 如果您在使用UC浏览器时发现设备上出现了未经允许安装的应用程序,可能是由于浏览器内置的下载管理器或广告推广机制触发了自动安装行为。此类问题通常与权限设置、…

    2026年9月23日
    200
  • 飞利浦559M1RYV对决AOC U34G3XE:带鱼屏与巨幕的沉浸式体验,办公娱乐两不误谁更全能?

    飞利浦559M1RYV适合追求影院级沉浸体验的用户,拥有55英寸大屏、HDMI 2.1接口、Ambiglow灯效和宝华韦健音响,需搭配主机使用且占用空间大;AOC U34G3XE为34英寸21:9带鱼屏,主打多任务办公与高效分屏,兼顾电影原生比例与主流游戏,适合桌面空间有限的生产力用户。选择取决于核…

    2026年9月23日
    600
  • Vue.js 项目中实现练习进度保存的策略与实践

    本文将探讨在vue.js项目中实现用户练习进度保存的最佳实践。针对需要跨会话保留用户进度的场景,我们将重点介绍如何利用浏览器localstorage进行数据持久化,包括数据的序列化与反序列化、在关键生命周期钩子中加载与保存数据,以及相关的注意事项,确保用户能够从上次中断的地方继续练习。 在开发基于V…

    2026年9月23日
    100
  • 如何在mysql中备份二进制日志

    答案:MySQL二进制日志备份可通过mysqlbinlog工具导出、直接复制日志文件、定时归档及结合mysqldump全量备份实现,需配合FLUSH LOGS和SHOW BINARY LOGS确保一致性,并制定保留策略以支持数据恢复。 在 MySQL 中,二进制日志(Binary Log)记录了所有…

    2026年9月23日
    100
  • Photopea中AI图片如何导出为PNG?快速保存图像的实用方法

    答案:在Photopea中导出AI生成图片为PNG,需点击“文件”→“导出为”→选择PNG,设置质量100%、勾选透明度并确认尺寸后保存;为平衡质量与文件大小,优先调整图像尺寸而非降低质量,高分辨率图片可缩放以优化;常见技巧包括使用高分辨率源图、保留图层非破坏性编辑;其他格式如JPEG适合无透明背景…

    2026年9月23日
    200
  • 小说全文免费阅读APP榜单 小说阅读免费APP推荐大全

    直接观看“☞☞☞☞☞点击小说资源在线观看首页直达☜☜☜☜☜”; 直接观看“☞☞☞☞☞点击海内外小说、漫画观看APP合集☜☜☜☜☜”; 还在为找不到好用又免费的小说APP而烦恼吗?市面上免费阅读应用众多,但质量参差不齐。本文为你精选了几款广受好评的免费小说阅读APP,帮助你轻松找到心仪的阅读神器,畅享…

    2026年9月23日
    100
  • 如何使用Java制作简易的博客系统

    首先搭建Spring Boot后端,设计BlogPost实体类并用JPA实现数据持久化,通过BlogController处理页面请求,使用Thymeleaf模板引擎渲染index和create页面,配置H2内存数据库并启用控制台,最终实现文章的发布与展示功能。 用Java制作一个简易的博客系统,核心…

    2026年9月23日
    200
  • qq浏览器主页被篡改了如何修复_qq浏览器主页被篡改修复方法

    首先检查QQ浏览器设置中的主页地址并修正,接着查看桌面快捷方式目标路径是否被添加恶意网址并清理,然后使用腾讯电脑管家等工具扫描修复,最后可尝试重置浏览器或通过注册表编辑器锁定主页,防止再次被篡改。 QQ浏览器主页被篡改,通常是由恶意软件、插件或安全软件锁定导致的。修复的关键是检查多个可能被修改的位置…

    2026年9月23日
    100
  • 渗透测试|利用curl回传文件

    在处理低权限shell回传文件的问题时,如果无法使用scp命令且无法安装sshpass,可以考虑使用curl命令进行文件传输。以下是详细的伪原创内容: 至少我们曾经在一起过。 来自:一言 var xhr = new XMLHttpRequest();xhr.open(‘get’, ‘https://…

    2026年9月23日
    100
  • 抖音涨粉慢怎么办?快速提升粉丝量的10个有效方法

    抖音涨粉慢怎么办?快速提升粉丝量的10个有效方法抖音涨粉慢怎么办?快速提升粉丝量的10个有效方法抖音涨粉慢怎么办?快速提升粉丝量的10个有效方法抖音涨粉慢怎么办?快速提升粉丝量的10个有效方法

    抖音涨粉慢可通过10个方法提升,一是明确内容定位,选择垂直领域持续输出,如美妆测评、职场干货等,提高系统推荐精准度;二是做好前3秒“钩子”,用问题、数据或反差吸引用户停留;三是蹭热点话题和挑战,结合创意参与提升曝光;四是引导评论互动,增加算法权重;五是选择合适发布时间,匹配目标人群活跃时段;六是保持…

    2026年9月23日 • 用户投稿
    300
  • VSCode如何配置Scala开发环境 VSCode搭建Scala项目的完整教程

    首先安装jdk 11或17并正确配置java_home和path环境变量;2. 通过包管理器或官网安装sbt,用于项目构建与依赖管理;3. 在vscode中安装scala (metals)插件,以获得代码补全、错误检查等语言服务;4. 使用sbt new scala/scala-seed.g8创建项…

    2026年9月23日
    100
  • PHP面向对象高级特性_PHP高级OOP设计模式

    PHP高级OOP特性如命名空间、Traits、魔术方法等结合设计模式可提升代码质量。1. 命名空间避免类冲突,Traits实现横向复用,后期静态绑定支持运行时解析,魔术方法增强对象控制,抽象类与接口定义契约,Final防止继承修改。2. 单例确保唯一实例,工厂封装创建逻辑,依赖注入降低耦合,观察者实…

    2026年9月23日
    100
  • Airtable的AI混合工具怎么用?快速管理数据的智能化操作步骤

    Airtable的AI混合工具通过将AI能力嵌入数据管理流程,实现自动化处理、分析与内容生成。首先明确AI需求,如总结反馈或生成文案;接着选择AI字段或在自动化中添加AI动作;然后配置模型与提示词,精准设计指令以确保输出质量;指定输入输出字段后进行测试迭代,优化提示词直至满意;最后部署并持续监控。该…

    2026年9月23日
    100
  • Laravel Nova 4 动作响应持久化:告别短暂Toast,拥抱长效通知

    本文探讨了Laravel Nova动作响应消息(Toast)持续时间过短的问题,特别是在处理耗时操作时。针对这一局限性,我们提供了利用Laravel Nova 4内置通知(NovaNotification)功能的解决方案,以实现更持久、可交互且用户友好的消息提示,确保用户即使在离开页面后也能及时获取…

    2026年9月23日
    000
  • Java中ConnectException连接异常的解决方法

    答案:Java中ConnectException通常因服务未启动、网络不通或配置错误导致,需检查服务状态、IP端口配置及防火墙设置,并合理设置连接超时与重试机制。 Java中出现ConnectException通常表示应用程序尝试连接到远程服务器时失败,最常见的原因是目标主机拒绝连接或网络不通。这个…

    2026年9月23日
    200
  • Steam同时在线4166万破纪录!《战地6》首发立大功

    Steam同时在线4166万破纪录!《战地6》首发立大功Steam同时在线4166万破纪录!《战地6》首发立大功Steam同时在线4166万破纪录!《战地6》首发立大功Steam同时在线4166万破纪录!《战地6》首发立大功

    全球最大pc游戏平台steam于10月12日晚再度刷新历史纪录,同时在线用户数突破4166万(41,666,455),创下该平台自上线以来的最高峰值。 这一里程碑的达成,很大程度上得益于EA旗下射击大作《战地6》的正式发售。游戏上线后迅速吸引大量玩家,最高同时在线人数达到74万,目前已经成为Stea…

    2026年9月23日 • 用户投稿
    300

发表回复

登录后才能评论
关注微信