HtmlUnit学习总结
HtmlUnit学习总结
本文摘抄其他博客或者技术论坛,自己搜集整理如下:
HtmlUnit学习总结
摘要
htmlunit 是一款开源的java 页面分析工具,读取页面后,可以有效的使用htmlunit分析页面上的内容。项目可以模拟浏览器运行,被誉为java浏览器的开源实现。是一个没有界面的浏览器,运行速度迅速。(百度百科)
环境搭建
<dependency><groupId>net.sourceforge.htmlunit</groupId><artifactId>htmlunit</artifactId><version>2.15</version></dependency>
1. 基本使用
HtmlUnit简介:HtmlUnit说白了就是一个浏览器,这个浏览器是用Java写的无界面的浏览器,正因为其没有界面,因此执行的速度还是可以滴,HtmlUnit提供了一系列的API,这些API可以干的功能比较多,如表单的填充,表单的提交,模仿点击链接,由于内置了Rhinojs引擎,因此可以执行Javascript。
网络爬虫第一个要面临的问题,就是如何抓取网页,抓取其实很容易,没你想的那么复杂,一个开源HtmlUnit包,4行代码就OK啦,例子如下:
final WebClient webClient=new WebClient();//创建对象final HtmlPage page=webClient.getPage("https://www.baidu.com");//获取页面System.out.println(page.asText());//asText() 顾名思义 获取所有文本webClient.closeAllWindows();//关闭窗口
在程序中写上上面的4行代码,运行,就可以得到页面的全部内容,上面代码在运行的过程中会出现很多警告,出现这些警告的主要原因是由于以下两点:
1.HtmlUnit对Javascript的支持不是很好
2.HtmlUnit对CSS的支持不是很好
明白了上面的两点后,将代码重新改写一下,该禁用的就禁用,同时禁用一些不必要的功能,也有利于提高程序的运行效率,再者说网络爬虫也不需要CSS的支持
final WebClient webClient=new WebClient();webClient.getOptions().setCssEnabled(false);//关闭csswebClient.getOptions().setJavaScriptEnabled(false);//关闭jsfinal HtmlPage page=webClient.getPage("https://www.baidu.com");System.out.println(page.asText());webClient.closeAllWindows();
重要API的使用 在介绍API的使用之前要先明白的一个问题是,WebClient,WebWindow,Page三者之间的关系,所有的页面最终都是在一个WebWindow对象里面,WebClient在创建时会自动的创建一个WebWindow对象,当调用getPage时会将新页面加载到WebWindow里,你可以理解成WebClient就是IE内核,WebWindow就是呈现页面的浏览器窗口,三者之间的关系图如下图所示:
1.1 模拟特定浏览器
可以模拟的浏览器有Chrome/FireFox/IE
//模拟chorme浏览器,其他浏览器请修改BrowserVersion.xxx常量WebClient webClient=new WebClient(BrowserVersion.CHROME);
1.2 代理服务器的配置
代理的配置很简单,只需要配置好地址,端口,用户名与密码即可
final WebClient webClient = newWebClient(BrowserVersion.CHROME,"http://127.0.0.1",8087);final DefaultCredentialsProvider credentialsProvider = (DefaultCredentialsProvider)webClient.getCredentialsProvider();credentialsProvider.addCredentials("username","password");
1.3 模拟表单的提交
//获取表单final HtmlForm form = page.getFormByName("form");//获取提交按扭final HtmlSubmitInput button = form.getInputByName("submit");//一会得输入的final HtmlTextInput textField = form.getInputByName("userid");textField.setValueAttribute("test");//点击提交表单final HtmlPage page = button.click();
1.4 获取页中所有的链接
网络爬虫中主要目的就是获取页中所有的链接,代码如下:
List<HtmlAnchor> achList=page.getAnchors();for(HtmlAnchor ach:achList){System.out.println(ach.getHrefAttribute());}
1.5 使用Htmlunit上传文件
使用HtmlUnit模拟浏览器操作时,我们有时候要做一些上传文件操作。这就要利用HtmlFileInput这个类了。
通过page获得HtmlForm,再通过HtmlForm获得HtmlFileInput
HtmlForm form = page.getFormByName("form");//如果有form的话//如果在获取HtmlForm时,发现form表单没有name属性,也可以通过下列语句获取//HtmlForm form = page.getForms().get(0);HtmlFileInput fileInput = form.getInputByName("fileInput");//通过设置valueAttribute来确定上传哪个文件fileInput.setValueAttribute("D:\\111.jpg");//最后按下提交按钮提交HtmlElement submitBtn = page.getElementByName("submit");submitBtn.click();
这样就完成了一次上传文件的过程。
1.6 查找特定元素
通过get或者XPath可以从HtmlPage中获得特定的Html元素,如下例子
1.6.1 通过get方法获取
HtmlPage page=webClient.getPage("http://www.yanyulin.info");//从[烟雨林博客]上获取标签hed的内容HtmlDivision div=(HtmlDivision)page.getElementById("hed");
1.6.2 通过XPath获取
XPath通常用于无法通过Id搜索或者需要更为复杂的搜索时,XPath的相关教程Xpath
//同样可以打印出hed的内容,//div中//表示搜索整个文档中的div,并将这些div//放入list中,然后获取第一个divfinal HtmlDivision div = (HtmlDivision) page.getByXPath("//div").get(0);System.out.println(div.asXml());//asXml() 转换为xml形式
1.6.3 通过CSS选择器(Selector)获取
querySelector(String selectors) 获取匹配选择器的第一个元素
DomNodeList<DomNode> domNodeList=querySelectorAll(String selectors) 获取所有匹配选择器的元素
示例: 贴吧自动抢二楼 教程
通过CSS选择器(Selector)获取元素,代码片段如下:
(查看完整代码点击:完整代码)
// 获取当前页的所有class="i"元素。返回 DOM节点列表DomNodeList<DomNode> iList = page.querySelectorAll(".i");// 遍历for(DomNode i: iList) {// 选择 p 元素DomNode p = i.querySelector("p");// asText() 返回 元素文本, contains是 String的方法,查找 "回0 " 字符串if(p.asText().contains("回0 ")) {// 这里就是找到了 回帖为0的帖子// 我们用 父元素 div.i 来继续获取 子元素 a 标签。HtmlAnchor a = (HtmlAnchor)i.querySelector("a");// 获取 a 标签的属性 href ,就是帖子详情的地址啦!!String href = a.getAttribute("href");System.out.println(href);}
2.WebClient常用使用流程及参数设置
//1.创建对象WebClient webClient=new WebClient(BrowserVersion.CHROME);//2.设置参数//启动jswebClient.getOptions().setJavaScriptEnabled(true);//关闭css渲染webClient.getOptions().setCssEnabled(false);//启动重定向webClient.getOptions().setRedirectEnabled(true);//启动cookie管理webClient.setCookieManager(new CookieManager());//启动ajax代理webClient.setAjaxController(new NicelyResynchronizingAjaxController());//js运行时错误,是否抛出异常webClient.getOptions().setThrowExceptionOnScriptError(false);//3.获取页面HtmlPage page=webClient.getPage(url);//等待js渲染执行 waitime等待时间(ms)webClient.waitForBackgroundJavaScript(waitime);//4.解析页面......
HtmlUnit学习总结的更多相关文章
- htmlunit学习之java.lang.NoSuchMethodError: com.gargoylesoftware.htmlunit.WebClient.getOptions()Lcom/gargoylesoftware/htmlunit/WebClientOptions;
运行到这里就报错 java.lang.NoSuchMethodError: com.gargoylesoftware.htmlunit.WebClient.getOptions()Lcom/gargo ...
- HttpClient学习整理
HttpClient简介HttpClient 功能介绍 1. 读取网页(HTTP/HTTPS)内容 2.使用POST方式提交数据(httpClient3) 3. 处理页面重定向 ...
- java apache commons HttpClient发送get和post请求的学习整理(转)
文章转自:http://blog.csdn.net/ambitiontan/archive/2006/01/06/572171.aspx HttpClient 是我最近想研究的东西,以前想过的一些应用 ...
- 基于HtmlUnit的模板的网页数据抽取
既然方向定了,就开始做实验室吧,做舆情分析,首先就是要收集相关的语料 正好实验室有同学在做标化院的信息抽取抽取这块 于是把程序拿过来研究研究正好 完整程序在126邮箱共享: 可下载数:20 共享连接 ...
- webdriver(python)学习笔记一
最近有python开发的项目,也正打算要学习自动化与python语言.因此想通过学习python版本的webdriver来一同学习. 学习过程中参考资料有乙醇的博客:https://github.co ...
- 【转】对于HttpClient和HtmlUnit的理解
原文地址:http://www.haohaoblog.com/?p=1327&utm_source=tuicool 做Java编程的人其实,很多不懂SEO,也不知道如何让百度收录等等,当然,对 ...
- httpclient 学习
Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性,它不仅是客户端发送Http请求变得容易,而且也方便了开发人员测试接口(基 ...
- htmlunit+fastjson抓取酷狗音乐 qq音乐链接及下载
上次学了jsoup之后,发现一些动态生成的网页内容是无法抓取的,于是又学习了htmlunit,下面是抓取酷狗音乐与qq音乐链接的例子: 酷狗音乐: import java.io.BufferedInp ...
- Java 爬虫学习
Java爬虫领域最强大的框架是JSoup:可直接解析具体的URL地址(即解析对应的HTML),提供了一套强大的API,包括可以通过DOM.CSS选择器,即类似jQuery方式来取出和操作数据.主要功能 ...
随机推荐
- vs2017 重新生成报错 MSB4057 BuildDependsOn DependsOnTargets ContainerPrepareForLaunch 解决办法
环境: win10 vs2017 .net core 删除引用的包: Microsoft.VisualStudio.Azure.Containers.Tools.Targets
- JavaScript “函数重载”
函数重载(function overloading)必须依赖两件事情:判断传入参数数量的能力和判断传入参数类型的能力. JavaScript的每个函数都带有一个仅在这个函数范围内作用的变量argume ...
- 慢阻肺疾病管理APP——第一次迭代心得
时光匆匆,不知不觉就到了第十二周.——第一次迭代都完成了,最终迭代还会远吗? 一.第一次迭代的设想和目标: 1. 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? ...
- Ubuntu下Caffe实现物体分类
参考链接: ubuntu下配置Caffe:https://blog.csdn.net/a_z666666/article/details/72853346 https://www.cnblogs.co ...
- web应用及web.xml
一.创建web应用 1.在任意目录新建webDemo文件夹 2.在webDemo下新建WEB-INF文件夹(注意大小写) 3.在WEB-INF中新建web.xml文件(可以copy已有的web应用中的 ...
- JSP学习(1)---JSP基本原理
一.JSP的本质 其本质是Servlet,web应用中的每个jsp页面都会由servlet容器生成对应的servlet. 在tomcat中,jsp生成的servlet在work文件夹下: 原jsp文件 ...
- 常用的数学函数-S
// abs — 获取[数值]的绝对值 $; echo abs($int).'<br>'; $float=-2.34; echo abs($float).'<hr>'; //c ...
- struts2实现文件上传和下载
在做B/S系统时,通常会涉及到上传文件和下载文件,在没接struts2框架之前,我们都是使用apache下面的commons子项目的FileUpload组件来进行文件的上传,但是那样做的话,代码看起来 ...
- 20175224 2018-2019-2 《Java程序设计》第六周学习总结
教材学习内容总结 第七章:内部类与异常类 内部类:java支持在类中定义另一个类,这个类为内部类,包含内部类的类称为外嵌类. 理解内部类与外嵌类. Java编译器生成的内部类的字节码文件为“外嵌类名$ ...
- 20175224 2018-2019-2 《Java程序设计》第五周学习总结
教材学习内容总结 第六章:接口与实现 接口:关键字interface来定义一个接口.分为接口声明,接口体. interface Printable { final int MAX=100; void ...