HTMLUNIT

htmlunit 是一款开源的java 页面分析工具,读取页面后,可以有效的使用htmlunit分析页面上的内容。项目可以模拟浏览器运行,被誉为java浏览器的开源实现。是一个没有界面的浏览器,运行速度迅速。是junit的扩展之一,采用的是Rhinojs引擎。模拟js运行
1.HTMLUNIT的基本功能展示
首先我们新建一个Maven普通客户端项目,然后打开pom.xml

引入htmlunit支持:

<dependency><groupId>net.sourceforge.htmlunit</groupId><artifactId>htmlunit</artifactId><version>2.26</version>
</dependency>

然后我们写一个测试类,来解析www.baidu.com 获取网页html以及网页文本,这里有点类似httpClient,但是底层执行过程默认多了一个js执行过程(当然htmlunit提供了关闭js解析设置);

import java.io.IOException;
import java.net.MalformedURLException;import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;public class HtmlUnitTest {public static void main(String[] args) {WebClient webClient=new WebClient(); // 实例化Web客户端  try {HtmlPage page=webClient.getPage("http://www.baidu.com"); // 解析获取页面System.out.println("网页html:"+page.asXml()); // 获取HtmlSystem.out.println("====================");System.out.println("网页文本:"+page.asText()); // 获取文本} catch (FailingHttpStatusCodeException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (MalformedURLException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{webClient.close(); // 关闭客户端,释放内存}}
}

前面我们的测试代码是直接请求的,有些网站服务器防火墙会直接拒绝访问。

我们现在用htmlunit来模拟下浏览器请求;主要是加了一些头消息;
这个是我们用火狐调试工具看到的请求头小心里的属性,当然上面还有返回的头消息;

我们用htmlunit可以模拟浏览器执行,内置的可以模拟IE,火狐,谷歌;

WebClient构造方法里有个重载方法,可以加一个指定版本属性;
完整代码:

import java.io.IOException;
import java.net.MalformedURLException;import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;public class HtmlUnitTest {public static void main(String[] args) {WebClient webClient=new WebClient(BrowserVersion.FIREFOX_52); // 实例化Web客户端 try {HtmlPage page=webClient.getPage("http://www.java1234.com"); // 解析获取页面System.out.println("网页html:"+page.asXml()); // 获取HtmlSystem.out.println("====================");System.out.println("网页文本:"+page.asText()); // 获取文本} catch (FailingHttpStatusCodeException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (MalformedURLException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{webClient.close(); // 关闭客户端,释放内存}}
}

htmlunit 提供了丰富的api来获取指定元素 jsoup有的 htmlunit也有;

我们这里举例:

import java.io.IOException;
import java.net.MalformedURLException;import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomElement;
import com.gargoylesoftware.htmlunit.html.DomNodeList;
import com.gargoylesoftware.htmlunit.html.HtmlDivision;
import com.gargoylesoftware.htmlunit.html.HtmlListItem;
import com.gargoylesoftware.htmlunit.html.HtmlPage;public class HtmlUnitTest2 {public static void main(String[] args) {WebClient webClient=new WebClient(BrowserVersion.FIREFOX_52); // 实例化Web客户端 try {HtmlPage page=webClient.getPage("http://www.baidu.com");HtmlDivision div=page.getHtmlElementById("navMenu");  // 查找指定id的html dom元素System.out.println(div.asXml());System.out.println("======================");DomNodeList<DomElement> aList=page.getElementsByTagName("a"); // 根据tag名称查询所有tagfor(int i=0;i<aList.getLength();i++){DomElement a=aList.get(i);System.out.println(a.asXml());}System.out.println("======================");HtmlListItem item =(HtmlListItem) page.getByXPath("//div[@id='navMenu'][1]/ul/li").get(0); // xpath方式System.out.println(item.asXml());} catch (FailingHttpStatusCodeException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (MalformedURLException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{webClient.close();}}}

有时候频繁的爬取第三方站点内容,会被站点的防火墙拦截,IP拉黑,所以这时候,就要用到代理IP,拉黑一个就换一个;

htmlunit实用代理的方式比较简单,WebClient重载构造方法就有提供,我们看下演示代码:

import java.io.IOException;
import java.net.MalformedURLException;import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;public class HtmlUnitTest3 {public static void main(String[] args) {WebClient webClient=new WebClient(BrowserVersion.FIREFOX_52,"202.106.16.36",3128); // 实例化Web客户端try {HtmlPage page=webClient.getPage("http://www.baidu.com"); // 解析获取页面System.out.println("网页html:"+page.asXml()); // 获取HtmlSystem.out.println("====================");System.out.println("网页文本:"+page.asText()); // 获取文本} catch (FailingHttpStatusCodeException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (MalformedURLException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{webClient.close(); // 关闭客户端,释放内存}}}

htmlunit(一)相关推荐

  1. html post 图片,如何发送图片作为多部分POST请求的一部分 - Java HtmlUnit

    我正尝试使用Java将验证码提交给decaptcher.com. Decaptcher并没有很好的解释如何使用他们的API,所以我想弄清楚如何使用HTTP POST请求来提交验证码.下面是示例代码,我 ...

  2. 模拟浏览器的神器 - HtmlUnit

    2019独角兽企业重金招聘Python工程师标准>>> 随着Web的发展,RIA越来越多,JavaScript和Complex AJAX Libraries给网络爬虫带来了极大的挑战 ...

  3. 响应时登录html,HtmlUnit:单击不响应时登录HtmlElement

    由于您尚未发布要调用的网址,因此我只能提供一些提示. 即使HtmlUnit在幕后发挥了很多魔力,您也需要对所有Web技术有基本的了解 从代码看来,登录是基于Ajax完成的:这有一些含义:Ajax需要启 ...

  4. java使用htmlunit工具抓取js中加载的数据

    htmlunit 是一款开源的java 页面分析工具,读取页面后,可以有效的使用htmlunit分析页面上的内容.项目可以模拟浏览器运行,被誉为java浏览器的开源实现.这个没有界面的浏览器,运行速度 ...

  5. htmlunit爬虫工具使用--模拟浏览器发送请求,获取JS动态生成的页面内容

    Htmlunit是一款模拟浏览抓取页面内容的java框架,具有js解析引擎(rhino),可以解析页面的js脚本,得到完整的页面内容,特殊适合于这种非完整页面的站点抓取. 下载地址: https:// ...

  6. htmlunit 发http请求

    2019独角兽企业重金招聘Python工程师标准>>> htmlunit 发http请求 博客分类: java public static WebClient createWebCl ...

  7. HtmlUnit爬取页面列表链接

    场景:爬虫网页列表上的链接,用于再次爬虫,主要功能是列表翻页功能. 代码参考: package com;import com.gargoylesoftware.htmlunit.BrowserVers ...

  8. HtmlUnit自动填写表单并提交

    场景:对网页的表单进行自动填写并提交,如登录框,和文章http://blog.csdn.net/fjssharpsword/article/details/51480475类似,不同的是这次butto ...

  9. HtmlUnit动态执行js函数

    功能:动态指定js函数,实际上这个效果不是很有用,这里就做一个记录而已,参考代码如下: package com; import com.gargoylesoftware.htmlunit.Browse ...

  10. HtmlUnit采集页面信息加工并写入excel表

    1.功能:从网页上采集信息加工,如将商品名字重组(Name2FiveWords函数),并写入excel表,涉及对htmlunit元素定位以及点击重定向. 2.参考代码如下: package com;i ...

最新文章

  1. 激光雷达和毫米波雷达
  2. struts上传文件 血案
  3. SQL server 2005中无法新建作业(Job)的问题
  4. 电子科技学院计算机调剂,2020年电子科技大学电子科学技术研究院考研调剂信息...
  5. C语言库函数(Q类字母)
  6. SQL Union 和 Union All 的区别以及二者的性能问题 - 使用Sqlite演示
  7. 古希腊三大数学书(二)
  8. 从今开始,好好学习一下算法!
  9. SpringCloud创建Eureka Client服务注册
  10. java线程池_Java 并发编程 线程池源码实战
  11. 基于JAVA+SpringMVC+Mybatis+MYSQL的在线考试系统
  12. nginx 内置变量大全(转)
  13. notepad 自动排版html,notepad++怎么自动排版
  14. 走进C++程序世界-------类的定义和使用(数据成员和方法成员,析构函数,构造函数,内联实现)
  15. JavaEE | 集合之HashMap与ConcurrentHashMap(看完多线程后补充)
  16. 登陆和登录,login
  17. 怎么快速做一个excel手机报表?
  18. 考研英语二2017阅读理解Text3
  19. 字母‘x‘在CSS世界中的角色和故事
  20. 中兴财务新云陈虎:财务应从最小数据集转为大数据 洞察五新商机

热门文章

  1. shell脚本中如何获取命令的参数(2) ----处理命令参数
  2. 基于ansible的自动化二进制模式部署高可用Kubernetes集群
  3. 《妙趣横生的算法》第10章 算法设计与数据结构面试精粹之常见的算法设计题10-10(question?)
  4. 数据结构(九)——最短路径问题
  5. 修改Rom中的一些资源文件
  6. 中秋qq表情包 2004 下载
  7. profile 和 bashrc 的区别
  8. Macbook pro 13 Installs Ubuntu 18.04
  9. 从永远到永远-我的狼狈的2019
  10. 《惢客创业日记》2020.09.14(周一)结束王者游戏的调研