htmlunit 是一款开源的java 页面分析工具,读取页面后,可以有效的使用htmlunit分析页面上的内容。项目可以模拟浏览器运行,被誉为java浏览器的开源实现。是一个没有界面的浏览器,运行速度迅速。
环境搭建
Maven依赖 <dependency> <groupId>net.sourceforge.htmlunit</groupId> <artifactId>htmlunit</artifactId> <version>2.15</version> </dependency>
1. 基本使用
final WebClient webClient=new WebClient();//创建对象 final HtmlPage page=webClient.getPage("https://www.baidu.com");//获取页面 System.out.println(page.asText());//asText() 顾名思义 获取所有文本 webClient.closeAllWindows();//关闭窗口
List<HtmlAnchor> achList=page.getAnchors(); for(HtmlAnchor ach:achList){ System.out.println(ach.getHrefAttribute()); }
1.HtmlUnit对Javascript的支持不是很好
2.HtmlUnit对CSS的支持不是很好所以我们修改一下,
final WebClient webClient=new WebClient(); webClient.getOptions().setCssEnabled(false);//关闭css webClient.getOptions().setJavaScriptEnabled(false);//关闭js final HtmlPage page=webClient.getPage("https://www.baidu.com"); System.out.println(page.asText()); webClient.closeAllWindows();
1.1 模拟特定浏览器
//模拟chorme浏览器,其他浏览器请修改BrowserVersion.xxx常量 WebClient webClient=new WebClient(BrowserVersion.CHROME);
1.2 代理服务器的配置
代理的配置很简单,只需要配置好地址,端口,用户名与密码即可
final WebClient webClient = new WebClient(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方法获取
XPath通常用于无法通过Id搜索或者需要更为复杂的搜索时,XPath的相关教程Xpath
//同样可以打印出hed的内容,//div中//表示搜索整个文档中的div,并将这些div //放入list中,然后获取第一个div final 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) 获取所有匹配选择器的元素
// 获取当前页的所有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.设置参数 //启动js webClient.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.解析页面 ......