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