建站网络公司,商城网站建设解决方案,wordpress 图片加水印,东莞企业怎么做网站建设1、引言
在当今信息爆炸的时代#xff0c;网络数据的获取和处理变得至关重要。对于 Java 开发者而言#xff0c;掌握高效的网页抓取技术是提升数据处理能力的关键。本文将深入探讨三款广受欢迎的 Java 网页抓取工具#xff1a;Jsoup、HtmlUnit 和 WebMagic#xff0c;分析…1、引言
在当今信息爆炸的时代网络数据的获取和处理变得至关重要。对于 Java 开发者而言掌握高效的网页抓取技术是提升数据处理能力的关键。本文将深入探讨三款广受欢迎的 Java 网页抓取工具Jsoup、HtmlUnit 和 WebMagic分析它们的功能特点、优势以及适用场景以助开发者选择最适合自己项目需求的工具。
2、Jsoup
2.1、简介
Jsoup 是一款 Java 编写的开源 HTML 解析器它提供了一套丰富的 API用于解析、操作和清理 HTML 文档。Jsoup 能够从网页中提取数据并且广泛应用于网络爬虫、数据挖掘和自动化测试等领域。
Jsoup 官方网站
2.2、特性
轻量级Jsoup 作为一个轻量级的库不需要额外的服务器或复杂的配置即可使用。解析能力能够从 HTML 文件、字符串或 URL 中解析文档并提取数据。强大的选择器支持 CSS 选择器和正则表达式使得数据提取更加灵活和高效。易于使用API 设计直观易于上手适合初学者和有经验的开发者。处理异常能够处理 HTML 文档中的异常情况如不完整的标签等。
2.3、优点
易学易用Jsoup 的 API 设计简单直观学习成本低。灵活性支持多种数据提取方式适应不同的数据抽取需求。社区支持作为一个成熟的开源项目Jsoup 拥有活跃的社区方便获取帮助和资源。
2.4、缺点
不支持 JavaScript无法直接处理 JavaScript 动态加载的内容。性能限制对于大型或复杂的 HTML 文档解析速度可能不如其他专业的解析工具。安全风险如果不正确使用可能会引入跨站脚本攻击XSS等安全问题。
2.5、使用场景
静态网页爬取适用于从不需要执行 JavaScript 的静态网页中提取信息。数据提取从网页中提取链接、图片、文本等数据。自动化测试在 Web 应用程序的自动化测试中用于模拟用户操作和验证页面内容。内容清洗清理 HTML 文档移除不需要的元素或属性确保输出的 HTML 是安全和干净的。
2.6、注意事项
JavaScript 渲染Jsoup 不执行 JavaScript因此无法直接从依赖 JavaScript 动态生成的内容中提取数据。编码问题在处理非标准编码的 HTML 文档时可能需要手动设置字符编码。异常处理虽然 Jsoup 能够处理一些异常情况但对于某些复杂的 HTML 结构可能需要额外的处理逻辑。
2.7、示例代码
如果你使用的是 Maven可以在 pom.xml 文件中添加以下依赖
!-- https://mvnrepository.com/artifact/org.jsoup/jsoup --
dependencygroupIdorg.jsoup/groupIdartifactIdjsoup/artifactIdversion1.17.2/version !-- 请使用最新版本 --
/dependency以下是一个简单的 Jsoup 示例代码演示了如何抓取百度首页上的热门搜索新闻
public class JsoupExample {public static void main(String[] args) {// 目标网页 URLString url https://www.baidu.com;try {// 连接到网页并获取文档对象Document doc Jsoup.connect(url).get();// 获取百度首页热搜Elements hotSearchList doc.selectXpath(//*[id\hotsearch-content-wrapper\]/li);System.out.println(今日百度热搜);// 遍历所有热搜新闻for (Element hotSearch : hotSearchList) {Elements newsMetaList hotSearch.selectXpath(.//span);for (Element newsMeta : newsMetaList) {System.out.print(newsMeta.text() );}System.out.print(\n);}} catch (Exception e) {e.printStackTrace();}}
}运行结果截图如下 Jsoup 主要用于静态网页的内容抓取对于使用 Vue.js 等现代 JavaScript 框架构建的动态网站其直接获取页面内容的能力受限。由于 Vue.js 等框架通过 JavaScript 动态生成页面内容Jsoup 无法执行相应的脚本因此可能无法获取到完整的、动态渲染的数据。
因此使用 Jsoup 爬取这类网站时通常只能获取到初始的、不包含动态数据的HTML结构。结果如下
!doctype html
htmlheadmeta charsetutf-8/headbodydiv idapp/div/body
/html3、HtmlUnit
3.1、简介
HtmlUnit 是一个用 Java 编写的无界面浏览器它模拟 HTML 文档并提供了一系列 API允许开发者以编程方式与网页进行交互。这个工具可以用于自动化测试、网络爬虫以及自动化网页交互等场景。HtmlUnit 支持 JavaScript通过 Mozilla Rhino 引擎并且能够处理 AJAX 功能使得它能够与现代的动态网页进行交互。
HtmlUnit 官方网站
HtmlUnit GitHub
3.2、特性
无界面HtmlUnit 不需要图形用户界面可以在服务器或后台环境中运行。支持 JavaScript内置 Rhino JavaScript 引擎可以执行 JavaScript 代码处理 AJAX 请求。模拟浏览器行为可以模拟用户在浏览器中的操作如点击、表单提交等。多浏览器模拟可以模拟多种浏览器如 Chrome、Firefox、Internet Explorer 等。丰富的 API提供了丰富的 API 来操作网页元素如获取、设置属性、执行事件等。
3.3、优点
易用性HtmlUnit 的 API 设计简单直观易于上手和使用。跨平台作为无界面浏览器HtmlUnit 可以在任何支持Java的平台上运行。社区支持作为一个成熟的开源项目HtmlUnit 拥有活跃的社区可以方便地获取帮助和资源。
3.4、缺点
性能由于 HtmlUnit 需要解释 JavaScript对于复杂的 JavaScript 操作性能可能不如真实浏览器。兼容性虽然支持多种浏览器特性但仍有可能遇到一些网页在 HtmlUnit 中无法正确渲染或表现的问题。更新维护随着 Web 技术的发展HtmlUnit 需要不断更新以支持新的Web标准和特性这可能导致版本间的不兼容问题。
3.5、使用场景
自动化测试用于 Web 应用程序的功能测试模拟用户操作验证应用程序的行为。网络爬虫抓取网站数据提取信息适用于数据分析、数据挖掘等。Web 自动化自动化执行 Web 相关的任务如登录、下载文件、填写并提交表单等。
3.6、注意事项
CSS 和 JavaScript 支持HtmlUnit 对 CSS 和 JavaScript 的支持可能不如真实浏览器完美有时候需要禁用 CSS 和 JavaScript 来避免潜在的问题。异常处理在处理 JavaScript 错误时可以通过设置来防止测试因脚本错误而失败。版本兼容性使用 HtmlUnit 时需要注意库的版本与依赖的其他库的兼容性以及与目标网站的 JavaScript 和 CSS 的兼容性。
3.7、示例代码
如果你使用的是 Maven可以在 pom.xml 文件中添加以下依赖
!-- https://mvnrepository.com/artifact/org.htmlunit/htmlunit --
dependencygroupIdorg.htmlunit/groupIdartifactIdhtmlunit/artifactIdversion4.0.0/version !-- 请使用最新版本 --
/dependency以下是一个简单的 HtmlUnit 示例代码演示了如何抓取百度首页上的热门搜索新闻
public class HtmlUnitExample {public static void main(String[] args) {// 目标网页 URLString url https://www.baidu.com;WebClient webClient getWebClient();try {// 打开网页HtmlPage page webClient.getPage(url);// 获取网页标题String title page.getTitleText();System.out.println(网页标题: title);// 获取百度首页热搜ListDomElement hotSearchList page.getByXPath(//*[id\hotsearch-content-wrapper\]/li);System.out.println(今日百度热搜);// 遍历所有热搜新闻for (DomElement hotSearch : hotSearchList){ListDomElement newsMetaList hotSearch.getByXPath(.//span);for (DomElement newsMeta : newsMetaList) {System.out.print(newsMeta.asNormalizedText() );}System.out.print(\n);}} catch (Exception e) {e.printStackTrace();} finally {// 关闭WebClient释放资源webClient.close();}}/*** h2获取一个 Web 模拟浏览器客户端/h2*/public static WebClient getWebClient(){// 浏览器设置WebClient webClient new WebClient(BrowserVersion.CHROME);// ajaxwebClient.setAjaxController(new NicelyResynchronizingAjaxController());// 支持jswebClient.getOptions().setJavaScriptEnabled(true);// 忽略js错误webClient.getOptions().setThrowExceptionOnScriptError(false);// 忽略css错误webClient.setCssErrorHandler(new SilentCssErrorHandler());// 不执行CSS渲染webClient.getOptions().setCssEnabled(false);// 超时时间webClient.getOptions().setTimeout(3000);// 允许重定向webClient.getOptions().setRedirectEnabled(true);// 允许cookiewebClient.getCookieManager().setCookiesEnabled(true);return webClient;}
}运行结果截图如下 4、WebMagic
4.1、简介
WebMagic 是一个简单灵活的 Java 爬虫框架。基于 WebMagic你可以快速开发出一个高效、易维护的爬虫。
WebMagic 官方网站
WebMagic 总体架构图如下 4.2、特性
简洁的 APIWebMagic 提供了简单直观的 API使得开发者可以快速编写爬虫程序。强大的抽取能力支持多种数据抽取方式包括 XPath、正则表达式等方便从网页中提取所需数据。多线程处理WebMagic 内部采用多线程进行页面抓取提高了爬取效率。自动重试机制在请求失败时WebMagic 能够自动重试增强了爬虫的稳定性。灵活的数据处理允许开发者自定义数据处理逻辑可以将数据存储到数据库、文件或进行其他处理。Site 对象封装了目标网站的一些基本信息如编码、重试次数、抓取间隔等方便配置和调整。
4.3、优点
易学易用WebMagic 的 API 设计简单学习成本低适合初学者快速上手。高效稳定内置多线程处理和自动重试机制提高了爬虫的效率和稳定性。灵活性支持自定义数据处理可以轻松应对不同的数据存储和处理需求。
4.4、缺点
社区支持相比于其他流行的爬虫框架WebMagic 的社区可能相对较小资源和支持可能有限。更新维护Web 技术不断发展WebMagic 需要不断更新以适应新的网页结构和反爬策略可能存在一定的维护成本。JavaScript 渲染WebMagic 在处理 JavaScript 动态渲染的页面时可能存在局限对于复杂的 JavaScript 操作可能需要额外的处理。
4.5、使用场景
数据抓取适用于抓取网站信息如新闻、博客、商品数据等。网站监控可以用来监控目标网站的更新及时获取最新内容。数据分析抓取的数据可以直接用于数据分析、市场研究等领域。
4.6、注意事项
遵守 robots.txt在使用 WebMagic 进行爬虫开发时应遵守目标网站的 robots.txt 文件规定尊重网站的爬虫策略。合理设置抓取间隔为了避免对目标网站造成过大压力应设置合理的抓取间隔和重试次数。异常处理网络请求可能会失败需要在代码中进行适当的异常处理。
4.7、示例代码
如果你使用的是 Maven可以在 pom.xml 文件中添加以下依赖 !-- https://mvnrepository.com/artifact/us.codecraft/webmagic-core --
!-- WebMagic是一个简单灵活的爬虫框架其核心部分webmagic-core是一个精简的、模块化的爬虫实现。 --
dependencygroupIdus.codecraft/groupIdartifactIdwebmagic-core/artifactIdversion0.9.0/version
/dependency!-- https://mvnrepository.com/artifact/us.codecraft/webmagic-extension --
!-- WebMagic的扩展模块webmagic-extension为使用者提供了更方便的编写爬虫的工具包括注解格式定义爬虫、JSON、分布式等支持。 --
dependencygroupIdus.codecraft/groupIdartifactIdwebmagic-extension/artifactIdversion0.9.0/version
/dependency!-- https://mvnrepository.com/artifact/us.codecraft/webmagic-selenium --
!-- WebMagic 是一个基于 Java 的开源网络爬虫框架而 Selenium 是一个用于自动化 Web 浏览器的工具。 --
dependencygroupIdus.codecraft/groupIdartifactIdwebmagic-selenium/artifactIdversion0.9.0/version
/dependency
以下是一个简单的 WebMagic 示例代码演示了如何抓取百度首页上的热门搜索新闻
1、自定义下载器
WebMagic-Selenium 是 WebMagic 爬虫框架的一个扩展它结合了 WebMagic 的爬虫能力和 Selenium 的浏览器自动化功能。这种结合使得 WebMagic-Selenium 能够处理那些需要执行 JavaScript 或模拟用户交互才能获取完整信息的动态网页。
通过使用 WebMagic-Selenium开发者可以利用 WebMagic 的简洁 API 来定义爬虫的抓取逻辑同时使用 Selenium 来处理那些需要复杂交互的网页。例如可以模拟用户的登录过程、处理弹出窗口、执行复杂的表单提交等操作。
WebMagic 默认使用了 Apache HttpClient 作为下载工具。
/*** h1自定义下载器/h1* Downloader 负责从互联网上下载页面以便后续处理。* WebMagic 默认使用了Apache HttpClient作为下载工具。* */
public class WNDownloader implements Downloader {// 声明驱动private RemoteWebDriver driver;Overridepublic Page download(Request request, Task task) {// 第一个参数是使用哪种浏览器驱动第二个参数是浏览器驱动的地址System.setProperty(webdriver.chrome.driver,/Users/yaoshuaizhou/Downloads/chromedriver-mac-arm64/chromedriver);// 创建浏览器参数对象ChromeOptions chromeOptions new ChromeOptions();// 设置为 无界面浏览器 模式,若是不想看到浏览器打开就可以配置此项// chromeOptions.addArguments(--headless);chromeOptions.addArguments(--window-size1440,1080); // 设置浏览器窗口打开大小this.driver new ChromeDriver(chromeOptions); // 创建驱动driver.get(request.getUrl()); // 第一次打开url跳转到登录页try {Thread.sleep(3000); // 等待打开浏览器// 获取从process返回的site携带的cookies填充后第二次打开urlSite site task.getSite();if (site.getCookies() ! null) {// for (Map.Entry cookieEntry : site.getCookies()
//
// .entrySet()) {
//
// Cookie cookie new Cookie(cookieEntry.getKey(),
//
// cookieEntry.getValue());
//
// driver.manage().addCookie(cookie);
//
// }// 添加对应domain的cookie后第二次打开urldriver.get(request.getUrl());}Thread.sleep(2000);// 需要滚动到页面的底部,获取完整的数据driver.executeScript(window.scrollTo(0, document.body.scrollHeight - 1000));Thread.sleep(2000); // 等待滚动完成// 获取页面打包成Page对象传给PageProcessor 实现类Page page createPage(request.getUrl(), driver.getPageSource());driver.close(); // 看需要是否关闭浏览器return page;} catch (InterruptedException e) {throw new RuntimeException(e);}}Overridepublic void setThread(int i) {}//构建page返回对象private Page createPage(String url, String content) {Page page new Page();page.setRawText(content);page.setUrl(new PlainText(url));page.setRequest(new Request(url));page.setDownloadSuccess(true);return page;}
}2、自定义页面解析器
/*** h1自定义页面解析器/h1* PageProcessor 负责解析页面抽取有用信息以及发现新的链接。* WebMagic 使用 Jsoup 作为 HTML 解析工具并基于其开发了解析 XPath 的工具 Xsoup。* */
public class WNPageProcessor implements PageProcessor {private Site site Site.me().setCharset(UTF-8) // 设置编码.setSleepTime(1) // 抓取间隔时间.setTimeOut(1000 * 10) // 超时时间.setRetrySleepTime(3000) // 重试时间.setRetryTimes(3).addHeader(CSDN, woniu).addHeader(Content-Type, application/json;charsetUTF-8);Overridepublic void process(Page page) {Html html page.getHtml();ListSelectable hotSearchList html.xpath(//*[id\hotsearch-content-wrapper\]/li).nodes();System.out.println(今日百度热搜);// 遍历所有热搜新闻for (Selectable hotSearch : hotSearchList){ListSelectable newsMetaList hotSearch.xpath(//span/text()).nodes();for (Selectable newsMeta : newsMetaList) {System.out.print(newsMeta.get() );}System.out.print(\n);}// 存储可以传递到 WNPipelinepage.putField(woniu, 我是CSDN);}Overridepublic Site getSite() {return site;}
}3、自定义结果处理器
/*** h1自定义结果处理器/h1* Pipeline负责抽取结果的处理包括计算、持久化到文件、数据库等。* WebMagic默认提供了“输出到控制台”和“保存到文件”两种结果处理方案。* Pipeline定义了结果保存的方式如果你要保存到指定数据库则需要编写对应的Pipeline。* 对于一类需求一般只需编写一个Pipeline。* */
public class WNPipeline implements Pipeline {Overridepublic void process(ResultItems resultItems, Task task) {// 获取封装好的数据String woniu resultItems.get(woniu);System.out.println(WNPageProcessor 传递结果 woniu);}
}4、单元测试
public class WebMagicExample {public static void main(String[] args) {// 目标网页 URLString url https://www.baidu.com;Spider.create(new WNPageProcessor()) // 创建爬虫并指定PageProcessor.addUrl(url) // 添加需要爬取的URL.setDownloader(new WNDownloader()) // 设置 Downloader一个 Spider 只能有个一个 Downloader.addPipeline(new WNPipeline()) // 添加一个 Pipeline一个 Spider 可以有多个 Pipeline.thread(5) // 开启5个线程抓取.start(); // 开始爬取设置最多在10分钟内停止}
}Selenium 可以配置为两种模式运行有界面headed和无界面headless。
在默认情况下Selenium WebDriver 会启动一个完整的浏览器窗口用户可以直观地看到浏览器中的操作和页面变化这对于测试和调试非常有用。如下图 要启动无界面模式需要在 Selenium 的浏览器配置中添加相应的参数。例如在 Java 中使用ChromeDriver 时可以通过以下代码启动无界面模式
// 创建浏览器参数对象
ChromeOptions chromeOptions new ChromeOptions();// 设置为无界面浏览器模式若是不想看到浏览器打开就可以配置此项
chromeOptions.addArguments(--headless);这段代码会启动一个没有图形界面的 Chrome 浏览器并打开指定的网址。在无界面模式下所有的 Selenium 操作都会正常执行但不会有任何视觉反馈。
运行结果截图如下 5、知识库
5.1、Chrome 浏览器查找 html 元素中的 XPath 路径
在谷歌 Chrome 浏览器中查找 HTML 元素的 XPath 路径可以通过以下步骤进行
5.1.1、打开开发者工具
使用快捷键 Ctrl Shift I 或 F12 打开 Chrome 的开发者工具或者在页面上右键点击选择“检查”来打开。
5.1.2、切换到Elements面板
在开发者工具中默认选中的是 “元素Elements” 面板这里可以查看页面的 DOM 结构。
5.1.3、选择目标元素
使用鼠标点击页面上的目标元素或者使用开发者工具中的选择器工具点击左上角的小箭头图标后鼠标变为一个箭头状来选择页面上的元素。
5.1.4、复制 XPath 路径
在元素Elements面板中选中目标元素后右键点击该元素的代码行在弹出的菜单中选择“复制” “复制 XPath”来复制 XPath 路径。如果想要复制完整的 XPath 路径从根节点开始可以选择“复制” “复制完整 XPath”。 5.1.5、验证 XPath 路径
在开发者工具的控制台Console面板中可以使用 XPath 表达式来验证路径是否正确。例如输入$x(‘//XPath 表达式’)并回车如果路径正确控制台会输出匹配的元素数量
示例$x(‘//*[id“hotsearch-content-wrapper”]’)如下图 5.2、ChromeDriver 下载
ChromeDriver 下载地址请根据您使用的操作系统下载相应的 ChromeDriver 版本。 6、总结
Jsoup 主要用于抓取和解析静态 HTML 页面它不执行 JavaScript因此对于依赖 JavaScript动态加载内容的网站可能无法获取完整的页面信息。而 HtmlUnit 和 WebMagic 则具备处理动态网页的能力。
HtmlUnit 是一个无头浏览器它可以执行 JavaScript 代码从而允许用户与动态内容进行交互获取通过 JavaScript 动态加载的数据。这使得 HtmlUnit 非常适合抓取那些需要执行脚本才能显示完整内容的网站。
WebMagic 作为一个爬虫框架它不仅支持静态页面的抓取也能够通过内置的或自定义的处理器来处理动态内容。WebMagic 的多线程和分布式特性使其在大规模数据抓取方面表现出色尤其适合于处理复杂的动态网站。
因此在选择工具时如果目标网站主要是静态内容Jsoup 可能是一个简单且高效的选择。而如果网站包含大量的动态内容HtmlUnit 和 WebMagic 将更能满足需求。
综上所述Jsoup、HtmlUnit 和 WebMagic 各有千秋它们分别适用于不同的网页抓取场景。通过合理选择和应用这些工具开发者可以大幅提升工作效率优化项目质量从而在网络爬虫的开发之旅中取得成功。无论您的项目需求如何这三款工具都能为您提供强大的支持助您轻松应对网络数据抓取的挑战。
本文教程到此结束祝愿小伙伴们在编程之旅中能够愉快地探索、学习、成长