欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java网页抓取技术HtmlUnit

程序员文章站 2022-03-29 10:21:49
  在Java中有很多开源的组件来支持各种各样方式的网页抓取,仅仅是使用Java做网页抓取还是比较容易的。主要的网页抓取技术: HttpClient HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HT ......

  在Java中有很多开源的组件来支持各种各样方式的网页抓取,仅仅是使用Java做网页抓取还是比较容易的。主要的网页抓取技术:

HttpClient

HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。
以下列出的是 HttpClient 提供的主要的功能,要知道更多详细的功能可以参见 HttpClient 的主页。
(1)实现了所有 HTTP 的方法(GET,POST,PUT,HEAD 等)
(2)支持自动转向
(3)支持 HTTPS 协议
(4)支持代理服务器
(5)支持自动的Cookies管理等

Jsoup

jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。

网页获取和解析速度飞快,推荐使用。
主要功能如下:

  1. 从一个URL,文件或字符串中解析HTML;
  2. 使用DOM或CSS选择器来查找、取出数据;
  3. 可操作HTML元素、属性、文本;

HtmlUnit

htmlunit 是一款开源的java 页面分析工具,读取页面后,可以有效的使用htmlunit分析页面上的内容。项目可以模拟浏览器运行,被誉为java浏览器的开源实现。这个没有界面的浏览器,运行速度也是非常迅速的。采用的是Rhinojs引擎。模拟js运行。

  说白了就是一个浏览器,这个浏览器是用Java写的*面的浏览器,正因为其没有界面,因此执行的速度还是可以滴,HtmlUnit提供了一系列的API,这些API可以干的功能比较多,如表单的填充,表单的提交,模仿点击链接,由于内置了Rhinojs引擎,因此可以执行Javascript。
网页获取和解析速度较快,性能较好,推荐用于需要解析网页脚本的应用场景。

Watij

Watij(发音wattage)是一个使用Java开发的Web应用程序测试工具,鉴于Watij的简单性和Java语言的强大能力,Watij能够使您在真正的浏览器中完成Web应用程序的自动化测试。因为是调用本地浏览器,因此支持CSS渲染和JS执行。
网页获取速度一般,IE版本过低(6/7)时可能会引发内存泄露。


这里主要介绍HtmlUnit的网页抓取技术:

比较推荐使用HtmlUnit来进行网页抓取主要是因为:

  • 对于使用java实现的网页爬虫程序,我们一般可以使用apache的HttpClient组件进行HTML页面信息的获取,HttpClient实现的http请求返回的响应一般是纯文本的document页面,即最原始的html页面。
  • 对于一个静态的html页面来说,使用httpClient足够将我们所需要的信息爬取出来了。但是对于现在越来越多的动态网页来说,更多的数据是通过异步JS代码获取并渲染到的,最开始的html页面是不包含这部分数据的。

HtmlUnit是一个“Java程序的无gui浏览器”。它为HTML文档建模,并提供了一个API,允许您调用页面、填写表单、单击链接等等。就像你在“普通”浏览器中做的那样。它有相当好的JavaScript支持(不断改进),甚至可以使用相当复杂的AJAX库,根据所使用的配置来模拟Chrome、Firefox或Internet Explorer。它通常用于测试或从web站点检索信息。

Maven引入jar包:

<!-- 爬虫工具包 -->
<dependency>
    <groupId>net.sourceforge.htmlunit</groupId>
    <artifactId>htmlunit</artifactId>
    <version>2.30</version>
</dependency>

<dependency>
    <groupId>net.sourceforge.htmlunit</groupId>
    <artifactId>htmlunit-core-js</artifactId>
    <version>2.28</version>
</dependency>

<dependency>
    <groupId>net.sourceforge.htmlunit</groupId>
    <artifactId>htmlunit-cssparser</artifactId>
    <version>1.0.0</version>
</dependency>
//引入jsoup来对网页进行解析
<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.11.3</version>
</dependency>

<dependency>
    <groupId>net.sourceforge.htmlunit</groupId>
    <artifactId>neko-htmlunit</artifactId>
    <version>2.30</version>
</dependency>

下面是一个例子,创建了web客户端,并让它从某度加载主页。然后我们打印这个页面是否有正确的标题。getPage()可以根据返回的数据的内容类型返回不同类型的页面。在这种情况下,我们期望的是文本/html的内容类型,所以我们将结果转换为com.gargoylesoftware.htmlun.html.htmlpage。

很方便:

import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;

public class Test {

    public void homPage() throws Exception {
        try (final WebClient webClient = new WebClient()) {
            final HtmlPage page = webClient.getPage("http://www.baidu.com");
            System.out.println(page.getTitleText());
        }
    }

    public static void main(String[] args) {
        try {
            new Test().homPage();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
打印结果:
百度一下,你就知道
Process finished with exit code 0

具体的入门案例和Api可以参考官方提供的