HtmlUnit入门一

htmlunit 是一款开源的java 页面分析工具,读取页面后,可以有效的使用htmlunit分析页面上的内容。

项目可以模拟浏览器运行,被誉为java浏览器的开源实现。是一个没有界面的浏览器。

采用的是Rhinojs引擎。模拟js运行。

 

使用htmlunit抓取网页大概可以分为以下几个步骤:

1、定义一个WebClient客户端。

  就相当于定义了一个没有界面的浏览器。

2、使用WebClient客户端从指定URL获取HtmlPage。

  HtmlPage中包含目标URL页面中的所有信息。

3、从HtmlPage中获取我们需要的指定元素。

 

下面就来看一个实例:

package com.fuwh;

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

public class Demo01 {

    public static void main(String[] args) {
        
        WebClient webClient=null;
        try {
             webClient= new WebClient();    //定义一个默认的WebClient
            HtmlPage page=webClient.getPage("https://www.cnblogs.com/");    //从指定URL获取HtmlPage
            System.out.println(page.asText());    //将HtmlPage转换成字符串打印出来
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }finally {
            webClient.close();    //关闭客户端
        }
    }
}

 

上面的实例中,我们创建的是一个默认的WebClient实例,使WebClient#getBrowserVersion()方法,可以看到,

默认创建的是Chrome版本的浏览器。

当然,我们也可以在创建的时候指定浏览器的版本。

例子:

package com.fuwh;

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

public class Demo01 {

    public static void main(String[] args) {
        
        WebClient webClient=null;
        try {
             webClient= new WebClient(BrowserVersion.FIREFOX_45);    //定义一个WebClient
            HtmlPage page=webClient.getPage("https://www.cnblogs.com/");    //从指定URL获取HtmlPage
            System.out.println(page.asText());    //将HtmlPage转换成字符串打印出来
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }finally {
            webClient.close();    //关闭客户端
        }
    }
}

在BrowserVersion中,定义了很多种浏览器的版本。

 

在获得一个HtmlPage之后,相对于把整个页面打出来,我们还是更希望能够找出我们想要的元素。

HtmlUnit对于查找指定元素也提供了丰富的支持。

支持使用DOM,CSS和XPath(推荐)的方式。

使用DOM方式

package com.fuwh;

import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomElement;
import com.gargoylesoftware.htmlunit.html.DomNodeList;
import com.gargoylesoftware.htmlunit.html.HtmlAnchor;
import com.gargoylesoftware.htmlunit.html.HtmlDivision;
import com.gargoylesoftware.htmlunit.html.HtmlPage;

public class Demo01 {

    public static void main(String[] args) {
        
        WebClient webClient=null;
        try {
             webClient= new WebClient(BrowserVersion.FIREFOX_45);    //定义一个WebClient
            final HtmlPage page=webClient.getPage("https://www.cnblogs.com/");    //从指定URL获取HtmlPage
            
            /**
             * DomElement 的子类:HtmlElement
             * HtmlElemnt也有很多子类,基本上涵盖了所有的Html元素
             * 例如:HtmlDivision,HtmlInput
             */
            System.out.println("=============================================");
            //通过id获取指定DOM元素
            HtmlDivision htmlDiv=(HtmlDivision) page.getElementById("header");
            System.out.println(htmlDiv.asXml());

            System.out.println("=============================================");
            //通过tagName来获取元素集合
            DomNodeList<DomElement> nodeList=page.getElementsByTagName("a");
            for (DomElement domElement : nodeList) {
                HtmlAnchor htmlAnchor=(HtmlAnchor) domElement;
                System.out.println("标题:"+htmlAnchor.asText()+"   -->   地址:"+htmlAnchor.getAttribute("href"));
            }
            
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }finally {
            webClient.close();    //关闭客户端
        }
    }
}

 

使用CSS方式

package com.fuwh;

import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomElement;
import com.gargoylesoftware.htmlunit.html.DomNodeList;
import com.gargoylesoftware.htmlunit.html.HtmlAnchor;
import com.gargoylesoftware.htmlunit.html.HtmlDivision;
import com.gargoylesoftware.htmlunit.html.HtmlPage;

public class Demo02 {

    public static void main(String[] args) {
        
        WebClient webClient=null;
        try {
             webClient= new WebClient(BrowserVersion.FIREFOX_45);    //定义一个WebClient
            final HtmlPage page=webClient.getPage("https://www.cnblogs.com/");    //从指定URL获取HtmlPage
            
            HtmlDivision htmlDiv =page.querySelector("div");//获取第一个div
            System.out.println(htmlDiv.asXml());
            
            System.out.println("====================================");
            
            HtmlDivision htmlDiv2=page.querySelector("div#footer_bottom");//也可以指定多个选择器,通过‘,’隔开
            System.out.println(htmlDiv2.asXml());
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }finally {
            webClient.close();    //关闭客户端
        }
    }
}

 

使用XPath方式

package com.fuwh;

import java.util.List;

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

public class Demo03 {

    public static void main(String[] args) {
        
        WebClient webClient=null;
        try {
             webClient= new WebClient(BrowserVersion.FIREFOX_45);    //定义一个WebClient
            final HtmlPage page=webClient.getPage("https://www.cnblogs.com/");    //从指定URL获取HtmlPage
            
            List<HtmlDivision> divList=page.getByXPath("//div[@id='cnblogs_a1']");
            for (HtmlDivision htmlDivision : divList) {
                System.out.println("***********************************************8");
                System.out.println(htmlDivision.asXml());
            }
            
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }finally {
            webClient.close();    //关闭客户端
        }
    }
}