Java网页抓取技术HtmlUnit


  在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可以参考官方提供的文档

猜你喜欢

转载自www.cnblogs.com/keeya/p/9285042.html