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(); //关闭客户端 } } }