前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >使用Java进行网页抓取

使用Java进行网页抓取

原创
作者头像
用户7850017
修改于 2021-09-18 03:53:21
修改于 2021-09-18 03:53:21
4.1K00
代码可运行
举报
运行总次数:0
代码可运行

— 使用Java进行网页抓取 —

用于网页抓取的流行语言有Python、JavaScript和Node.js、PHP、Java、C#等。因为有很多选择,想要确定哪种语言最合适并不容易。每种语言都有其优点和缺点。在本文中,我们将使用Java进行网页抓取并使用 Java创建一个网页抓取工具。

网页抓取框架

有两个最常用的Java网页抓取库——JSoupHtmlUnit

JSoup是一个强大的库,可以有效地处理格式错误的HTML。这个库的名字来自于短语“tag soup”,它指的是格式错误的HTML文档。

HtmlUnit是用于Java程序的无图形用户界面或无头的浏览器。它可以模拟浏览器的关键方面,例如从页面中获取特定元素、单击这些元素等。正如这个库的名称所暗示的那样,它通常用于单元测试。这是一种模拟浏览器以进行测试的方法。

HtmlUnit也可用于网页抓取。好消息是,只需一行,就可以关闭JavaScript和CSS。这个库对网页抓取很有帮助,因为大多数情况下不需要JavaScript和CSS。后面我们将检查这两个库并创建网页抓取工具。

使用Java构建网络爬虫的先决条件

本教程使用Java进行网页抓取,前提是您要熟悉Java编程语言。为了管理包,我们将使用Maven。

除了Java基础知识外,您需要对网站的工作原理有初步的了解。还需要对HTML和使用XPath或CSS Selectors选择其中的元素有很好的了解。请注意,并非所有库都支持XPath。

CSS Selectors的快速概览

在我们继续本Java网页抓取教程之前,先回顾一下CSS Selectors

●#firstname–选择任何id等于“firstname”的元素

.blue–选择class包含“blue”的任何元素

p–选择所有<p>标签

div#firstname–选择等于“firstname”的div元素id

p.link.new–请注意,此处没有空格。选择<p class="link new">

p.link .new–请注意此处的空格。选择在<p class="link">里“new”类的任何元素

接下来,让我们回顾一下可用Java进行网页抓取的库。

Part 1 使用JSoup配合Java抓取网页

JSoup可能是使用Java进行网页抓取最常用的库了。让我们使用这个库来创建一个Java网页抓取工具。

总体来说,使用Java进行网页抓取涉及三个步骤。

01.获取JSoup

使用Java进行网页抓取的第一步是获取Java库。Maven可以在这里提供帮助。使用任何Java IDE创建一个Maven项目。如果您不想使用Maven,请前往以下页面查找替代进行下载:

https://jsoup.org/download

pom.xml(Project Object Model)文件中,为依赖项添加一个新部分并为JSoup添加一个依赖项。该pom.xml文件如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependencies>
       <dependency>
          <groupId>org.jsoup</groupId>
          <artifactId>jsoup</artifactId>
       <version>1.14.1</version>
       </dependency>
</dependencies>

有了以上条件,我们就可以创建一个Java抓取工具了。

02.获取和解析HTML

使用Java进行网页抓取的第二步是从目标URL中获取HTML并将其解析为Java对象。让我们从导入开始:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

请注意,使用通配符导入所有内容-import org.jsoup.*.并不是一个好习惯。想要始终准确导入您需要的内容尽量少用通配符。上述导入是我们将在本Java网页抓取教程中使用的内容。

JSoup提供了这个connect功能。此函数连接URL并返回一个Document.以下是获取页面HTML的方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Document doc = Jsoup.connect("https://en.wikipedia.org/wiki/Jsoup").get();

您会经常在一些地方看到这行代码,但它有一个缺点。这种快捷的方式没有做任何错误处理。更好的方法是创建一个函数。此函数以URL作为参数。首先,创建一个连接并将其存储在一个变量中。之后,get()调用连接对象的方法来检索HTML文档。该文档作为Document类的实例返回。该get()方法可以抛出一个IOException,此IOException需要进行处理,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static Document getDocument(String url) {
    Connection conn = Jsoup.connect(url);
    Document document = null;
    try {
         document = conn.get();
    } catch (IOException e) {
         e.printStackTrace();
     // handle error
     }
     return document;
}

在某些情况下,您需要传递自定义用户代理。这可以通过userAgent()在调用函数之前将用户代理字符串发送到函数来完成get()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Connection conn = Jsoup.connect(url);
conn.userAgent("custom user agent");
document = conn.get();

此操作基本能解决遇到的常见问题。

03.查询HTML

任何Java网络爬虫构建过程中最关键的步骤是查询HTMLDocument对象以获取所需数据。这是您在用Java编写网络爬虫时花费大部分时间的地方。

JSoup支持多种提取所需元素的方法。比如getElementByID,getElementsByTag等,使得它更容易查询DOM。

这是导航到Wikipedia上的JSoup页面示例。右键单击标题并选择“检查”,从而打开选定标题的开发人员工具。

具有唯一类的HTML元素
具有唯一类的HTML元素

在这种情况下,可以使用getElementByIDgetElementsByClass。这里要注意的一个重点是getElementById(注意单数Element返回一个Element对象,getElementsByClass(注意复数Elements返回Element对象的数组列表。

这个Elements的非常方便,因为这个库有一个Elements的扩展ArrayList<Element>.这个扩展使代码更简洁并提供更多功能。

在下面的代码示例中,first()方法可用于从ArrayList.获取第一个元素,在获得元素的引用后,text()可以用来获取文本。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Element firstHeading = document.getElementsByClass("firstHeading").first();
System.out.println(firstHeading.text());

这些功能都不错;但是,它们仅限于JSoup。对于大多数情况,select函数可能是更好的选择。选择功能不起作用的唯一情况是您需要向上遍历文档的时候。在这些情况下,您可能需要使用parent()children()child()。有关所有可用方法的完整列表,请访问此页面:

https://jsoup.org/cookbook/extracting-data/dom-navigation

以下代码演示了如何使用selectFirst()方法,该方法会返回第一个匹配项。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Element firstHeading= document.selectFirst(".firstHeading");

在这个例子中,使用了selectFirst()方法。如果需要选择多个元素,可以使用该select()方法。将采用CSS Selector作为参数并返回一个实例Elements,它是类型ArrayList<Element>的扩展。

Part 2.使用HtmlUnit配合Java抓取网页

有很多方法可以读取和修改加载的页面。HtmlUnit可以像浏览器一样使网页交互变得容易,包括阅读文本、填写表单、单击按钮等。在这种情况下,我们将使用该库中的方法从URL读取信息。

如上一节所述,使用Java进行网页抓取涉及三个步骤。

01.获取和解析HTML

使用Java进行网页抓取的第一步是获取Java库。Maven可以在这里提供帮助。创建一个新的maven项目或使用在上一节中创建的项目。如果您不想使用Maven,请前往此页面查找替代进行下载:

https://sourceforge.net/projects/htmlunit/

在该pom.xml文件中,dependenciesHtmlUnit添加一个新部分并为其添加依赖项。该pom.xml文件将如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
   <groupId>net.sourceforge.htmlunit</groupId>
   <artifactId>htmlunit</artifactId>
   <version>2.51.0</version>
</dependency>

02.获取HTML

使用Java进行网页抓取的第二步是从目标URL中检索HTML作为 Java对象。让我们从导入开始:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomNode;
import com.gargoylesoftware.htmlunit.html.DomNodeList;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlPage;

如上一节所述,执行通配符导入(例如import com.gargoylesoftware.htmlunit.html.*.)并不是一个好习惯。我们依旧不使用通配符,只导入我们需要的内容。这里导入的是我们将在本Java网页抓取教程中使用的内容。

在这个例子中,我们将抓取这个Librivox页面

HtmlUnit使用WebClient类来获取页面。第一步是创建此类的实例。在这个例子中,不需要CSS渲染,也没有使用JavaScript。我们可以设置选项来禁用这两个。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
WebClient webClient = new WebClient();
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setJavaScriptEnabled(false);
HtmlPage page = webClient.getPage("https://librivox.org/the-first-men-in-the-moon-by-hg-wells");

请注意,getPage()函数可以抛出

IOException.您需要在try-catch中引用它。

以下是函数返回HtmlPage实例的一个实现示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static HtmlPage getDocument(String url)  {
      HtmlPage page = null;
      try (final WebClient webClient = new WebClient()) {
           webClient.getOptions().setCssEnabled(false);
           webClient.getOptions().setJavaScriptEnabled(false);
           page = webClient.getPage(url);
      } catch (IOException e) {
           e.printStackTrace();
      }
      return page;
}

然后我们可以继续下一步。

03.查询HTML

有三类方法可以配合HTMLPage使用。第一个方法是利用DOM的方法,会使用getElementById()getElementByName()等,然后返回一个元素。这些也跟getElementsById()一样有类似的对应项,会返回所有匹配项。这类方法会返回一个DomElement对象或一个DomElement对象列表。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
HtmlPage page = webClient.getPage("https://en.wikipedia.org/wiki/Jsoup");
DomElement firstHeading = page.getElementById ("firstHeading");
System.out.print(firstHeading.asNormalizedText()); // prints Jsoup 

第二类方法是使用XPath。在本Java网页抓取教程中,我们将使用Java创建一个网页抓取工具。

导航到此页面,右键单击书名,然后单击检查。如果您已经熟悉XPath,您应该能够看到选择书名的XPath是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//div[@class="content-wrap clearfix"]/h1.
通过Xpath选择元素
通过Xpath选择元素

有两种方法可以使用XPath—getByXPath()和getFirstByXPath().它们返回HtmlElement而不是DomElement。请注意,引号等特殊字符需要使用反斜杠进行转义:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
HtmlElement book = page.getFirstByXPath("//div[@class=\"content-wrap clearfix\"]/h1");
System.out.print(book.asNormalizedText());

最后,第三类方法是使用CSS选择器。这类方法是querySelector()querySelectorAll()。他们分别返回DomNodeDomNodeList<DomNode>

为了使这个Java网络爬虫教程更加真实,让我们打印页面中的所有章节名称、读者名称和阅读持续时间。第一步是确定可以选择所有行的选择器。接下来,我们将使用querySelectorAll()方法选择所有行。最后,我们将对所有行运行一个循环并调用querySelector()以提取每个单元格的内容。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String selector = ".chapter-download tbody tr";
DomNodeList<DomNode> rows = page.querySelectorAll(selector);
for (DomNode row : rows) {
    String chapter = row.querySelector("td:nth-child(2) a").asNormalizedText();
    String reader = row.querySelector("td:nth-child(3) a").asNormalizedText();
    String duration = row.querySelector("td:nth-child(4)").asNormalizedText();
    System.out.println(chapter + "\t " + reader + "\t " + duration);
}

—— 结论 ——

几乎每个企业都需要网络抓取来分析数据并在市场上保持竞争力。了解网页抓取的基础知识以及如何使用Java构建网页抓取工具可以最终帮助企业做出更明智、更快速的决策,这对于企业取得成功至关重要。在本文中,我们看到了两个Java网页抓取示例。

如果您已经了解Java,则可能不需要探索用于网络抓取的任何其他语言。不过,如果您想了解如何使用Python进行网页抓取,我们有一个关于Python 网页抓取的教程。还有一个关于使用JavaScript和 Node.js进行网页抓取的教程。所有这些文章都应该帮助您选择适合您特定需求的最佳编程语言。

常见问题

Q:您可以用Java抓取网页吗?

A:是的。有许多强大的Java库用于网页抓取。其中两个例子分别是JSoup和HtmlUnit。这些库可帮助您连接到网页并提供许多方法来提取所需的信息。如果您了解Java,那么使用这些Java库将花费很少的时间。

Q:网络抓取合法吗?

A:这是一个复杂的问题,需要详细检查。我们在“网络抓取合法吗?”中深入探讨了这个主题。我们强烈建议您阅读下这篇文章。简而言之,只要遵循有关源目标或数据本身的法律,网络抓取就是一项合法活动。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
全文搜索实战1-简单网页抓取及搜索
es是基于docker安装,鉴于当前springboot对应的是7.6.2,为保持一致也安装该版本:
技术路漫漫
2020/07/11
8310
用爬虫解决问题
使用Java进行网络爬虫开发是一种常见的做法,它可以帮助你从网站上自动抓取信息。Java语言因为其丰富的库支持(如Jsoup、HtmlUnit、Selenium等)和良好的跨平台性,成为实现爬虫的优选语言之一。下面我将简要介绍如何使用Java编写一个基本的爬虫来解决数据抓取问题。
终有链响
2024/07/29
1090
爬取新闻网信息
学习了HttpClient和Jsoup,就掌握了如何抓取数据和如何解析数据。但是HttpClient对动态数据解析支持不是很友好,所以又学习了HtmlUtil,用于解析动态数据。
Remember_Ray
2020/09/15
1.3K0
HtmlUnit 爬虫简单案例——模拟登陆CSDN
最近要弄一个爬虫程序,想着先来个简单的模拟登陆, 在权衡JxBrowser和HtmlUnit 两种技术, JxBowser有界面呈现效果,但是对于某些js跳转之后的效果获取比较繁琐。
执笔记忆的空白
2020/12/24
1.5K0
Java写爬虫,你试过嘛?
初步定的方案用 python,因为IO读写方便,结合xpath,后来搭了环境,发现好多都忘记了,需要复习,所有最后决定用java,结合jsoup,htmlUtil等。
山河已无恙
2023/03/02
3910
Java写爬虫,你试过嘛?
Jsoup+Htmlunit抓取图片遇到坑
Jsoup是用于解析HTML,就类似XML解析器用于解析XML。 Jsoup它解析HTML成为真实世界的HTML。
赵哥窟
2019/07/14
2.7K0
HttpUnit 基础知识
htmlunit是一款开源的Java页面分析工具,读取页面后,可以有效的使用htmlunit 分析页面上的内容。项目可以模拟浏览器运行,被誉为Java浏览器的开源实现。这个没有界面的浏览器,运行速度也是非常迅速的。
Remember_Ray
2020/09/15
1.9K0
如何用Java实现网页抓取和数据提取?
要使用Java实现网页抓取和数据提取,我们可以使用一些常见的库和工具来帮助我们完成这个任务。在Java中,有一些强大的库可以帮助我们进行网页抓取和数据提取,例如Jsoup和HttpClient。下面将详细介绍如何使用这些库来实现网页抓取和数据提取。
用户1289394
2024/04/15
6620
如何用Java实现网页抓取和数据提取?
Java 报错信息 Error during JavaScript execution
进行各种各样的网页爬虫过程中,有些网页直接httpclient拿过来就能用,但是有些网站是需要等待js加载样式或者某些值的,使用httpclient没办法设置js等待时间,然后再抓取值。
heasy3
2020/08/02
1.4K0
格力与奥克斯空调在京东的选购指数(java爬虫案例-代码实现)
这前段时间有一件事“格力举报奥克斯空调质量",我看了一下京东这两家店铺,感觉很有意思,看着就觉得奥克斯空调选购指数高很多。所以,就尝试爬一下看看,练手小demo。
营琪
2019/11/04
2.8K0
HtmlUnit爬取Ajax动态生成的网页以及自动调用页面javascript函数
HtmlUnit是一款基于Java的没有图形界面的浏览器程序。它模仿HTML document并且提供API让开发人员像是在一个正常的浏览器上操作一样,获取网页内容,填充表单,点击超链接等等。
lovelife110
2021/01/14
3K0
Java网络爬虫抓取新浪微博个人微博记录
在正题之前,先了解一下java下抓取网页上特定内容的方法,也就是所谓的网络爬虫,在本文中只会涉及简单的文字信息与链接爬取。java中访问http的方式不外乎两种,一种是使用原生态的httpconnection,还有一种是使用封装好的插件或框架,如httpclient,okHttp等。在测试爬取网页信息的过程中,本人是使用的jsoup工具,因为该工具不仅仅封装了http访问,还有强大的html解析功能,详细使用教程可参考http://www.open-open.com/jsoup/。
code2roc
2023/07/19
5270
Java网络爬虫抓取新浪微博个人微博记录
使用HtmlUnit库的Java下载器:下载TikTok视频
在本文中,我们将深入探讨如何借助Java编程语言和HtmlUnit库构建一个高效的TikTok视频下载器。HtmlUnit是一款功能强大的库,能够模拟浏览器行为,无需实际打开浏览器窗口。这使得它成为爬虫技术的理想选择,尤其是在需要与JavaScript交互的网站上。
jackcode
2024/03/25
2080
使用HtmlUnit库的Java下载器:下载TikTok视频
Java模拟浏览器真实访问网页刷Pv
为什么需要刷PV?提升排名,提升权重,提升收录,以前我通过Go操作无头浏览器进行刷PV,并且执行页面Js。今天我在想是否可以通过Java来刷我新上线的某网站,同时我也不想依赖谷歌浏览器,于是找到了一个纯Java实现的包,坐标位置如下:
高久峰
2023/09/30
4960
jsoup爬虫工具的简单使用
解决方案: 1.通过url 获得doucment对象, 2.调用select()等方法获得Elements对象, 3.调用.text()等方法,获得自己想要的内容。
Mshu
2018/10/31
1.8K0
HtmlUnit动态数据未加载
因为程序的读取速度会快一些,而且推测 HtmlUnit是异步读取 html , css ,js
taixingyiji
2022/07/25
1.3K0
【Java】爬虫,看完还爬不下来打我电话[通俗易懂]
​ 先说一句我不是专业搞爬虫的,从2019-07-06到2019-07-11累计学习6天。这篇文章是对我这6天学习的总结。以我浅显的了解,在此我列出我曾经尝试过后来又放弃了的框架,最后压轴(zhoù)再写我正在使用的框架。目前有以下流行的爬虫框架技术:
全栈程序员站长
2022/07/28
2.3K0
【Java】爬虫,看完还爬不下来打我电话[通俗易懂]
【Java 进阶篇】使用 Java 和 Jsoup 进行 XML 处理
XML(可扩展标记语言)是一种常用的数据交换格式,它被广泛用于在不同系统之间传递和存储数据。Java作为一种强大的编程语言,提供了多种方式来处理XML数据。其中,Jsoup 是一个流行的Java库,用于解析和操作XML文档。本篇博客将详细介绍如何使用Java和Jsoup来处理XML数据,无论您是初学者还是有一定经验的开发者,都能受益匪浅。
繁依Fanyi
2023/10/25
4270
【Java 进阶篇】使用 Java 和 Jsoup 进行 XML 处理
如何利用Java和Kotlin实现动态网页内容抓取
动态网页内容通常是通过JavaScript动态加载的,传统的静态网页抓取工具(如简单的HTTP请求)无法直接获取这些内容。因此,我们需要借助一些技术手段来模拟浏览器行为,或者直接解析动态加载的数据。
小白学大数据
2025/02/09
640
网页抓取 - 完整指南
Web Scraping,也称为数据提取或数据抓取,是从网站或其他来源以文本、图像、视频、链接等形式提取或收集数据的过程。
海拥
2023/02/26
3.6K0
网页抓取 - 完整指南
相关推荐
全文搜索实战1-简单网页抓取及搜索
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验