htmlunit 抓取网页(htmlunitjava页面分析工具模拟运行 )
优采云 发布时间: 2022-02-28 04:02htmlunit 抓取网页(htmlunitjava页面分析工具模拟运行
)
htmlunit 是一个开源的java页面分析工具。阅读完页面后,可以有效地使用htmlunit对页面内容进行分析。
该项目可以模拟浏览器的操作,被称为java浏览器的开源实现。是没有界面的浏览器。
使用了 Rhinojs 引擎。模拟js运行。
使用htmlunit抓取网页大致可以分为以下几个步骤:
1、定义一个 WebClient 客户端。
相当于定义了一个没有界面的浏览器。
2、使用WebClient客户端从指定的URL获取HtmlPage。
HtmlPage 收录目标 URL 页面中的所有信息。
3、从 HtmlPage 中获取我们需要的指定元素。
我们来看一个例子:
1package com.fuwh;
2
3import com.gargoylesoftware.htmlunit.WebClient;
4import com.gargoylesoftware.htmlunit.html.HtmlPage;
5
6public class Demo01 {
7
8 public static void main(String[] args) {
9
10 WebClient webClient=null;
11 try {
12 webClient= new WebClient(); //定义一个默认的WebClient
13 HtmlPage page=webClient.getPage("https://www.cnblogs.com/"); //从指定URL获取HtmlPage
14 System.out.println(page.asText()); //将HtmlPage转换成字符串打印出来
15 } catch (Exception e) {
16 // TODO: handle exception
17 e.printStackTrace();
18 }finally {
19 webClient.close(); //关闭客户端
20 }
21 }
22}
23
在上面的例子中,我们创建了一个默认的WebClient实例,使用WebClient#getBrowserVersion()方法,可以看到,
默认创建Chrome版本的浏览器。
当然,我们也可以在创建时指定浏览器版本。
例子:
1package com.fuwh;
2
3import com.gargoylesoftware.htmlunit.BrowserVersion;
4import com.gargoylesoftware.htmlunit.WebClient;
5import com.gargoylesoftware.htmlunit.html.HtmlPage;
6
7public class Demo01 {
8
9 public static void main(String[] args) {
10
11 WebClient webClient=null;
12 try {
13 webClient= new WebClient(BrowserVersion.FIREFOX_45); //定义一个WebClient
14 HtmlPage page=webClient.getPage("https://www.cnblogs.com/"); //从指定URL获取HtmlPage
15 System.out.println(page.asText()); //将HtmlPage转换成字符串打印出来
16 } catch (Exception e) {
17 // TODO: handle exception
18 e.printStackTrace();
19 }finally {
20 webClient.close(); //关闭客户端
21 }
22 }
23}
24
在 BrowserVersion 中,定义了许多浏览器版本。
在获得一个 HtmlPage 之后,我们仍然希望能够找到我们想要的元素,而不是输入整个页面。
HtmlUnit 还为查找特定元素提供了丰富的支持。
支持使用 DOM、CSS 和 XPath 的方式(推荐)。
◇使用DOM方法:
1package com.fuwh;
2
3import com.gargoylesoftware.htmlunit.BrowserVersion;
4import com.gargoylesoftware.htmlunit.WebClient;
5import com.gargoylesoftware.htmlunit.html.DomElement;
6import com.gargoylesoftware.htmlunit.html.DomNodeList;
7import com.gargoylesoftware.htmlunit.html.HtmlAnchor;
8import com.gargoylesoftware.htmlunit.html.HtmlDivision;
9import com.gargoylesoftware.htmlunit.html.HtmlPage;
10
11public class Demo01 {
12
13 public static void main(String[] args) {
14
15 WebClient webClient=null;
16 try {
17 webClient= new WebClient(BrowserVersion.FIREFOX_45); //定义一个WebClient
18 final HtmlPage page=webClient.getPage("https://www.cnblogs.com/"); //从指定URL获取HtmlPage
19
20 /**
21 * DomElement 的子类:HtmlElement
22 * HtmlElemnt也有很多子类,基本上涵盖了所有的Html元素
23 * 例如:HtmlDivision,HtmlInput
24 */
25 System.out.println("=============================================");
26 //通过id获取指定DOM元素
27 HtmlDivision htmlDiv=(HtmlDivision) page.getElementById("header");
28 System.out.println(htmlDiv.asXml());
29
30 System.out.println("=============================================");
31 //通过tagName来获取元素集合
32 DomNodeList nodeList=page.getElementsByTagName("a");
33 for (DomElement domElement : nodeList) {
34 HtmlAnchor htmlAnchor=(HtmlAnchor) domElement;
35 System.out.println("标题:"+htmlAnchor.asText()+" --> 地址:"+htmlAnchor.getAttribute("href"));
36 }
37
38 } catch (Exception e) {
39 // TODO: handle exception
40 e.printStackTrace();
41 }finally {
42 webClient.close(); //关闭客户端
43 }
44 }
45}
46
◇使用CSS方法:
1package com.fuwh;
2
3import com.gargoylesoftware.htmlunit.BrowserVersion;
4import com.gargoylesoftware.htmlunit.WebClient;
5import com.gargoylesoftware.htmlunit.html.DomElement;
6import com.gargoylesoftware.htmlunit.html.DomNodeList;
7import com.gargoylesoftware.htmlunit.html.HtmlAnchor;
8import com.gargoylesoftware.htmlunit.html.HtmlDivision;
9import com.gargoylesoftware.htmlunit.html.HtmlPage;
10
11public class Demo02 {
12
13 public static void main(String[] args) {
14
15 WebClient webClient=null;
16 try {
17 webClient= new WebClient(BrowserVersion.FIREFOX_45); //定义一个WebClient
18 final HtmlPage page=webClient.getPage("https://www.cnblogs.com/"); //从指定URL获取HtmlPage
19
20 HtmlDivision htmlDiv =page.querySelector("div");//获取第一个div
21 System.out.println(htmlDiv.asXml());
22
23 System.out.println("====================================");
24
25 HtmlDivision htmlDiv2=page.querySelector("div#footer_bottom");//也可以指定多个选择器,通过‘,’隔开
26 System.out.println(htmlDiv2.asXml());
27 } catch (Exception e) {
28 // TODO: handle exception
29 e.printStackTrace();
30 }finally {
31 webClient.close(); //关闭客户端
32 }
33 }
34}
35
◇使用XPath方法:
1package com.fuwh;
2
3import java.util.List;
4
5import com.gargoylesoftware.htmlunit.BrowserVersion;
6import com.gargoylesoftware.htmlunit.WebClient;
7import com.gargoylesoftware.htmlunit.html.HtmlDivision;
8import com.gargoylesoftware.htmlunit.html.HtmlPage;
9
10public class Demo03 {
11
12 public static void main(String[] args) {
13
14 WebClient webClient=null;
15 try {
16 webClient= new WebClient(BrowserVersion.FIREFOX_45); //定义一个WebClient
17 final HtmlPage page=webClient.getPage("https://www.cnblogs.com/"); //从指定URL获取HtmlPage
18
19 List divList=page.getByXPath("//div[@id='cnblogs_a1']");
20 for (HtmlDivision htmlDivision : divList) {
21 System.out.println("***********************************************8");
22 System.out.println(htmlDivision.asXml());
23 }
24
25 } catch (Exception e) {
26 // TODO: handle exception
27 e.printStackTrace();
28 }finally {
29 webClient.close(); //关闭客户端
30 }
31 }
32}
33