HtmlUnit学习总结

转载 2016年09月13日 15:58:25
  • 7304

本文摘抄其他博客或者技术论坛,自己搜集整理如下:

HtmlUnit学习总结

摘要

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

环境搭建

MAVEN依赖


  1. <dependency>
  2. <groupId>net.sourceforge.htmlunit</groupId>
  3. <artifactId>htmlunit</artifactId>
  4. <version>2.15</version>
  5. </dependency>

1. 基本使用

HtmlUnit简介:HtmlUnit说白了就是一个浏览器,这个浏览器是用Java写的无界面的浏览器,正因为其没有界面,因此执行的速度还是可以滴,HtmlUnit提供了一系列的API,这些API可以干的功能比较多,如表单的填充,表单的提交,模仿点击链接,由于内置了Rhinojs引擎,因此可以执行Javascript

网络爬虫第一个要面临的问题,就是如何抓取网页,抓取其实很容易,没你想的那么复杂,一个开源HtmlUnit包,4行代码就OK啦,例子如下:


  1. final WebClient webClient=new WebClient();//创建对象
  2. final HtmlPage page=webClient.getPage("https://www.baidu.com");//获取页面
  3. System.out.println(page.asText());//asText() 顾名思义 获取所有文本
  4. webClient.closeAllWindows();//关闭窗口

在程序中写上上面的4行代码,运行,就可以得到页面的全部内容,上面代码在运行的过程中会出现很多警告,出现这些警告的主要原因是由于以下两点: 
1.HtmlUnitJavascript的支持不是很好 
2.HtmlUnitCSS的支持不是很好 
明白了上面的两点后,将代码重新改写一下,该禁用的就禁用,同时禁用一些不必要的功能,也有利于提高程序的运行效率,再者说网络爬虫也不需要CSS的支持


  1. final WebClient webClient=new WebClient();
  2. webClient.getOptions().setCssEnabled(false);//关闭css
  3. webClient.getOptions().setJavaScriptEnabled(false);//关闭js
  4. final HtmlPage page=webClient.getPage("https://www.baidu.com");
  5. System.out.println(page.asText());
  6. webClient.closeAllWindows();

重要API的使用 在介绍API的使用之前要先明白的一个问题是,WebClient,WebWindow,Page三者之间的关系,所有的页面最终都是在一个WebWindow对象里面,WebClient在创建时会自动的创建一个WebWindow对象,当调用getPage时会将新页面加载到WebWindow里,你可以理解成WebClient就是IE内核,WebWindow就是呈现页面的浏览器窗口,三者之间的关系图如下图所示:

1.1 模拟特定浏览器

可以模拟的浏览器有Chrome/FireFox/IE


  1. //模拟chorme浏览器,其他浏览器请修改BrowserVersion.xxx常量
  2. WebClient webClient=new WebClient(BrowserVersion.CHROME);

1.2 代理服务器的配置

代理的配置很简单,只需要配置好地址,端口,用户名与密码即可


  1. final WebClient webClient = newWebClient(BrowserVersion.CHROME,"http://127.0.0.1",8087);
  2. final DefaultCredentialsProvider credentialsProvider = (DefaultCredentialsProvider)webClient.getCredentialsProvider();
  3. credentialsProvider.addCredentials("username","password");

1.3 模拟表单的提交


  1. //获取表单
  2. final HtmlForm form = page.getFormByName("form");
  3. //获取提交按扭
  4. final HtmlSubmitInput button = form.getInputByName("submit");
  5. //一会得输入的
  6. final HtmlTextInput textField = form.getInputByName("userid");
  7. textField.setValueAttribute("test");
  8. //点击提交表单
  9. final HtmlPage page = button.click();

1.4 获取页中所有的链接

网络爬虫中主要目的就是获取页中所有的链接,代码如下:


  1. List<HtmlAnchor> achList=page.getAnchors();
  2. for(HtmlAnchor ach:achList){
  3. System.out.println(ach.getHrefAttribute());
  4. }

1.5 使用Htmlunit上传文件

使用HtmlUnit模拟浏览器操作时,我们有时候要做一些上传文件操作。这就要利用HtmlFileInput这个类了。

通过page获得HtmlForm,再通过HtmlForm获得HtmlFileInput


  1. HtmlForm form = page.getFormByName("form");//如果有form的话
  2. //如果在获取HtmlForm时,发现form表单没有name属性,也可以通过下列语句获取
  3. //HtmlForm form = page.getForms().get(0);
  4. HtmlFileInput fileInput = form.getInputByName("fileInput");
  5. //通过设置valueAttribute来确定上传哪个文件
  6. fileInput.setValueAttribute("D:\\111.jpg");
  7. //最后按下提交按钮提交
  8. HtmlElement submitBtn = page.getElementByName("submit");
  9. submitBtn.click();

这样就完成了一次上传文件的过程。

1.6 查找特定元素

通过get或者XPath可以从HtmlPage中获得特定的Html元素,如下例子

1.6.1 通过get方法获取


  1. HtmlPage page=webClient.getPage("http://www.yanyulin.info");
  2. //从[烟雨林博客]上获取标签hed的内容
  3. HtmlDivision div=(HtmlDivision)page.getElementById("hed");

1.6.2 通过XPath获取

XPath通常用于无法通过Id搜索或者需要更为复杂的搜索时,XPath的相关教程Xpath


  1. //同样可以打印出hed的内容,//div中//表示搜索整个文档中的div,并将这些div
  2. //放入list中,然后获取第一个div
  3. final HtmlDivision div = (HtmlDivision) page.getByXPath("//div").get(0);
  4. System.out.println(div.asXml());//asXml() 转换为xml形式

1.6.3 通过CSS选择器(Selector)获取

示例: 贴吧自动抢二楼 教程

通过CSS选择器(Selector)获取元素,代码片段如下: 
(查看完整代码点击:完整代码


  1. // 获取当前页的所有class="i"元素。返回 DOM节点列表
  2. DomNodeList<DomNode> iList = page.querySelectorAll(".i");
  3. // 遍历
  4. for(DomNode i: iList) {
  5. // 选择 p 元素
  6. DomNode p = i.querySelector("p");
  7. // asText() 返回 元素文本, contains是 String的方法,查找 "回0 " 字符串
  8. if(p.asText().contains("回0 ")) {
  9. // 这里就是找到了 回帖为0的帖子
  10. // 我们用 父元素 div.i 来继续获取 子元素 a 标签。
  11. HtmlAnchor a = (HtmlAnchor)i.querySelector("a");
  12. // 获取 a 标签的属性 href ,就是帖子详情的地址啦!!
  13. String href = a.getAttribute("href");
  14. System.out.println(href);
  15. }

2.WebClient常用使用流程及参数设置


  1. //1.创建对象
  2. WebClient webClient=new WebClient(BrowserVersion.CHROME);
  3. //2.设置参数
  4. //启动js
  5. webClient.getOptions().setJavaScriptEnabled(true);
  6. //关闭css渲染
  7. webClient.getOptions().setCssEnabled(false);
  8. //启动重定向
  9. webClient.getOptions().setRedirectEnabled(true);
  10. //启动cookie管理
  11. webClient.setCookieManager(new CookieManager());
  12. //启动ajax代理
  13. webClient.setAjaxController(new NicelyResynchronizingAjaxController());
  14. //js运行时错误,是否抛出异常
  15. webClient.getOptions().setThrowExceptionOnScriptError(false);
  16. //3.获取页面
  17. HtmlPage page=webClient.getPage(url);
  18. //等待js渲染执行 waitime等待时间(ms)
  19. webClient.waitForBackgroundJavaScript(waitime);
  20. //4.解析页面
  21. ......

HtmlUnit学习总结的更多相关文章

  1. htmlunit学习之java.lang.NoSuchMethodError: com.gargoylesoftware.htmlunit.WebClient.getOptions()Lcom/gargoylesoftware/htmlunit/WebClientOptions;

    运行到这里就报错 java.lang.NoSuchMethodError: com.gargoylesoftware.htmlunit.WebClient.getOptions()Lcom/gargo ...

  2. HttpClient学习整理

    HttpClient简介HttpClient 功能介绍    1. 读取网页(HTTP/HTTPS)内容    2.使用POST方式提交数据(httpClient3)    3. 处理页面重定向    ...

  3. java apache commons HttpClient发送get和post请求的学习整理(转)

    文章转自:http://blog.csdn.net/ambitiontan/archive/2006/01/06/572171.aspx HttpClient 是我最近想研究的东西,以前想过的一些应用 ...

  4. 基于HtmlUnit的模板的网页数据抽取

    既然方向定了,就开始做实验室吧,做舆情分析,首先就是要收集相关的语料 正好实验室有同学在做标化院的信息抽取抽取这块 于是把程序拿过来研究研究正好 完整程序在126邮箱共享: 可下载数:20  共享连接 ...

  5. webdriver(python)学习笔记一

    最近有python开发的项目,也正打算要学习自动化与python语言.因此想通过学习python版本的webdriver来一同学习. 学习过程中参考资料有乙醇的博客:https://github.co ...

  6. 【转】对于HttpClient和HtmlUnit的理解

    原文地址:http://www.haohaoblog.com/?p=1327&utm_source=tuicool 做Java编程的人其实,很多不懂SEO,也不知道如何让百度收录等等,当然,对 ...

  7. httpclient 学习

    Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性,它不仅是客户端发送Http请求变得容易,而且也方便了开发人员测试接口(基 ...

  8. htmlunit+fastjson抓取酷狗音乐 qq音乐链接及下载

    上次学了jsoup之后,发现一些动态生成的网页内容是无法抓取的,于是又学习了htmlunit,下面是抓取酷狗音乐与qq音乐链接的例子: 酷狗音乐: import java.io.BufferedInp ...

  9. Java 爬虫学习

    Java爬虫领域最强大的框架是JSoup:可直接解析具体的URL地址(即解析对应的HTML),提供了一套强大的API,包括可以通过DOM.CSS选择器,即类似jQuery方式来取出和操作数据.主要功能 ...

随机推荐

  1. Linux内核分析--进程创建,执行,切换

    学号:351 原创作品转载请注明出处本实验来源 https://github.com/mengning/linuxkernel/ 实验要求 从整理上理解进程创建.可执行文件的加载和进程执行进程切换,重 ...

  2. 四:(之九_容器资源限制)Dockerfile语法梳理和实践

    9 容器资源限制 9.1 Virtualbox :工具操作 9.2 内存限制 docker --help  只限定memory bytes,则memory-swap默认与其存储相同. 资源限制生效: ...

  3. MySQL的一些指令操作[简版]

    sudo apt-get install mysql-server pa aux | grep mysql sudo service mysql start sudo service mysql st ...

  4. 关于WCF服务 http://XXXXXX/XXX/xxx.svc不支持内容类型 application/sop+xml;charset=utf-8 错误解决方法

    有时候用IIS部署一个WCF服务时,无论是在客户端还是在服务端通过地址都能正常访问. 但是当你在客户端添加服务引用时, 怎么也添加不上, 会碰到了如下错误: 好啦. 现在说说怎么解决吧. 其实很简单. ...

  5. python基础数据类型练习2

    1,写代码,有如下列表,按照要求实现每一个功能li = ['alex', 'wusir', 'eric', 'rain', 'alex'] 计算列表的长度并输出print(len(li))答:结果为5 ...

  6. python中下划线的特殊用法

    python下划线用法总结: ① _XXX 不能用于“ from  model import * ”的导入: ②__XXX__ 系统定义名字: ③__XXX 类中的私有变量名. 总结:避免随意用下划线 ...

  7. SharePoint Framework 在web部件中使用已存在的JavaScript库 - 捆绑打包和外部引用

    博客地址:http://blog.csdn.net/FoxDave 在构建SPFx客户端web部件时,你可以使用公网已有的JavaScript库来构建强大的解决方案.但是在使用的时候你需要考虑你引用的 ...

  8. IP通信基础课堂笔记----第四章(重点中的重点)

    IPv4编址方法 一个IPv4地址可表示为一个32位的二进制数. IP地址前面的网络部分表示一个网段,后面部分(主机位)表示这个网段上的一台设备. 常用IP地址分为四类:A.B.C.D. 每类的网络地 ...

  9. OpenGL绘制一个四边形

    学习自:https://learnopengl-cn.github.io/01%20Getting%20started/04%20Hello%20Triangle/ OpenGL没有直接绘制四边形的a ...

  10. Linux 网络编程(一)--Linux操作系统概述

    一.Linux的内核版本 Linux内核的编号采用如下编号形式: 主版本号.此版本号.主补丁号.次补丁号 例如:2.6.26.3 第一个数字”2”是主版本号,表示第2大版本. 第二个数字”6”是此版本 ...