HtmlUnit入门一
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(); //关闭客户端
}
}
}
HtmlUnit入门一的更多相关文章
- HtmlUnit入门二
由于在在WebClient中,默认支持对CSS,JavaScript的解析,因此会总是会出现很多错误信息,并且执行速度也很慢. 因此,我们可以选择关闭掉WebClient对CSS,JavaScript ...
- 【零基础】快速入门爬虫框架HtmlUnit
迅速的HtmlUnit htmlunit是一款开源的web页面分析工具,理论上来说htmlunit应用于网页的自动化测试,但是相对来说更多人使用它来进行小型爬虫的快速开发.使用htmlunit进行爬虫 ...
- Selenium 2 入门
在多个浏览器中进行 Web 应用程序的端到端功能测试 Selenium 是一款有名的 Web 应用程序测试框架,用于进行功能测试.新版本 Selenium 2 结合了 Selenium 1 和 Web ...
- Selenium2入门(二)WebDriver
前文Selenium2入门(一)说到Selenium是Web 应用程序测试框架,那么如果对一个简单的web应用需求:打开浏览器,登录百度首页,输入“欧洲杯”关键词,点击搜索按钮 这一系列操作,能否用S ...
- HttpClient入门
HttpClient入门 HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 H ...
- 【转】对于HttpClient和HtmlUnit的理解
原文地址:http://www.haohaoblog.com/?p=1327&utm_source=tuicool 做Java编程的人其实,很多不懂SEO,也不知道如何让百度收录等等,当然,对 ...
- webdriver入门-Java
webdriver入门-Java 如何用webdriver打开一个浏览器,我们常用的浏览器有firefox和IE两种,firefox是selenium支持得比较成熟的浏览器,很多新的特性都会在fi ...
- 【转载】Spring boot学习记录(一)-入门篇
前言:本系列文章非本人原创,转自:http://tengj.top/2017/04/24/springboot0/ 正文 首先声明,Spring Boot不是一门新技术.从本质上来说,Spring B ...
- HttpClient和HtmlUnit的比较总结以及使用技巧
本文转自: https://blog.csdn.net/zstu_cc/article/details/39250903 https://blog.csdn.net/zstu_cc/article/d ...
随机推荐
- RDD概念、特性、缓存策略与容错
一.RDD概念与特性 1. RDD的概念 RDD(Resilient Distributed Dataset),是指弹性分布式数据集.数据集:Spark中的编程是基于RDD的,将原始数据加载到内存变成 ...
- Eclipse配置类似sublime的黑色主题
另一篇中,详细介绍了如何使用Eclipse+Pydev搭建Python环境,传送门:http://www.cnblogs.com/BH8ANK/p/8688110.html 下面介绍下如何在Eclip ...
- 指令-arModal-点击提示框模板
html 使用<ar-modal></ar-modal>: <ar-modal modal-obj="modalObj" ok="newAl ...
- 【alpha冲刺】随笔合集
Daily Scrum Meeting 第一天 [Alpha]Daily Scrum Meeting第一次 第二天 [Alpha]Daily Scrum Meeting第二次 第三天 [Alpha]D ...
- 项目Beta冲刺Day4
项目进展 李明皇 今天解决的进度 因服务器端未完成登录态维护,故无法进行前后端联动. 明天安排 前后端联动调试 林翔 今天解决的进度 因上课和实验室事务未完成登录态维护 明天安排 完成登录态维护 孙敏 ...
- Flask 学习 七 用户认证
使用werkzeug 实现密码散列 from werkzeug.security import generate_password_hash,check_password_hash class Use ...
- 使用 PHP 来做 Vue.js 的 SSR 服务端渲染
对于客户端应用来说,服务端渲染是一个热门话题.然而不幸的是,这并不是一件容易的事,尤其是对于不用 Node.js 环境开发的人来说. 我发布了两个库让 PHP 从服务端渲染成为可能.spatie/se ...
- 数据结构与算法 —— 链表linked list(01)
链表(维基百科) 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer).由于不必须按顺序存储, ...
- 分布式系统之消息中间件rabbitmq
分布式系统之消息中间件rabbitmq 博客分类: 感谢: 一般php 用rabbitmq java 用activemq http://spartan1.iteye.com/blog/11802 ...
- kafka之zookeeper 节点
1.zookeeper 节点 kafka 在 zookeeper 中的存储结构如下图所示: