htmlunit抓取动态网页(模拟运行1.HTMLUNIT的基本功能分析工具展示 )
优采云 发布时间: 2022-02-18 07:15htmlunit抓取动态网页(模拟运行1.HTMLUNIT的基本功能分析工具展示
)
HTML单元
htmlunit 是一个开源的java页面分析工具。阅读完页面后,可以有效地使用htmlunit分析页面上的内容。该项目可以模拟浏览器的操作,称为java浏览器的开源实现。它是一个没有快速运行界面的浏览器。它是junit的扩展之一,使用Rhinojs引擎。模拟js运行
1. HTMLUNIT的基本功能展示
首先我们新建一个Maven普通客户端项目,然后打开pom.xml
引入 htmlunit 支持:
1
2 net.sourceforge.htmlunit
3 htmlunit
4 2.26
5
6
7
然后我们写一个测试类来解析获取网页html和网页文本,和httpClient类似,但是底层执行过程默认是js执行过程(当然htmlunit提供了关闭js解析的设置);
1import java.io.IOException;
2import java.net.MalformedURLException;
3
4import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
5import com.gargoylesoftware.htmlunit.WebClient;
6import com.gargoylesoftware.htmlunit.html.HtmlPage;
7
8public class HtmlUnitTest {
9
10 public static void main(String[] args) {
11 WebClient webClient=new WebClient(); // 实例化Web客户端
12 try {
13 HtmlPage page=webClient.getPage("http://www.baidu.com"); // 解析获取页面
14 System.out.println("网页html:"+page.asXml()); // 获取Html
15 System.out.println("====================");
16 System.out.println("网页文本:"+page.asText()); // 获取文本
17 } catch (FailingHttpStatusCodeException e) {
18 // TODO Auto-generated catch block
19 e.printStackTrace();
20 } catch (MalformedURLException e) {
21 // TODO Auto-generated catch block
22 e.printStackTrace();
23 } catch (IOException e) {
24 // TODO Auto-generated catch block
25 e.printStackTrace();
26 }finally{
27 webClient.close(); // 关闭客户端,释放内存
28 }
29 }
30}
31
32
我们之前的测试代码是直接请求,有的网站服务器防火墙会直接拒绝访问。
我们现在使用htmlunit来模拟浏览器请求;主要是添加一些头信息;
这是我们用火狐调试工具看到的请求头中的属性,当然上面还有返回的头信息;
我们使用htmlunit来模拟浏览器执行,内置可以模拟IE、Firefox、Google;
WebClient构造函数中有一个重载方法,可以添加指定的版本属性;
完整代码:
1import java.io.IOException;
2import java.net.MalformedURLException;
3
4import com.gargoylesoftware.htmlunit.BrowserVersion;
5import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
6import com.gargoylesoftware.htmlunit.WebClient;
7import com.gargoylesoftware.htmlunit.html.HtmlPage;
8
9public class HtmlUnitTest {
10
11 public static void main(String[] args) {
12 WebClient webClient=new WebClient(BrowserVersion.FIREFOX_52); // 实例化Web客户端
13 try {
14 HtmlPage page=webClient.getPage("http://www.java1234.com"); // 解析获取页面
15 System.out.println("网页html:"+page.asXml()); // 获取Html
16 System.out.println("====================");
17 System.out.println("网页文本:"+page.asText()); // 获取文本
18 } catch (FailingHttpStatusCodeException e) {
19 // TODO Auto-generated catch block
20 e.printStackTrace();
21 } catch (MalformedURLException e) {
22 // TODO Auto-generated catch block
23 e.printStackTrace();
24 } catch (IOException e) {
25 // TODO Auto-generated catch block
26 e.printStackTrace();
27 }finally{
28 webClient.close(); // 关闭客户端,释放内存
29 }
30 }
31}
32
33
htmlunit提供了丰富的api来获取指定元素jsoup,有些htmlunit也有;
这里我们举一个例子:
<p>1import java.io.IOException;
2import java.net.MalformedURLException;
3
4import com.gargoylesoftware.htmlunit.BrowserVersion;
5import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
6import com.gargoylesoftware.htmlunit.WebClient;
7import com.gargoylesoftware.htmlunit.html.DomElement;
8import com.gargoylesoftware.htmlunit.html.DomNodeList;
9import com.gargoylesoftware.htmlunit.html.HtmlDivision;
10import com.gargoylesoftware.htmlunit.html.HtmlListItem;
11import com.gargoylesoftware.htmlunit.html.HtmlPage;
12
13public class HtmlUnitTest2 {
14
15 public static void main(String[] args) {
16 WebClient webClient=new WebClient(BrowserVersion.FIREFOX_52); // 实例化Web客户端
17 try {
18 HtmlPage page=webClient.getPage("http://www.baidu.com");
19 HtmlDivision div=page.getHtmlElementById("navMenu"); // 查找指定id的html dom元素
20 System.out.println(div.asXml());
21 System.out.println("======================");
22 DomNodeList aList=page.getElementsByTagName("a"); // 根据tag名称查询所有tag
23 for(int i=0;i