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();    //關閉客戶端
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM