官方网址:http://htmlunit.sourceforge.net/
有时候你需要模拟浏览器,HtmlUnit 就是个不错的选择
像 网页中js 中的内容,如果你想用爬虫爬取的话,用Jsoup 就不怎么行了,但是HtmlUnit 就是个不错的选择
(1) HtmlUnit模拟表单提交
下面的代码是模拟在百度里搜索 "root" 得到的page2 就是百度搜索"root" 的结果
package com.xinsearch; 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.HtmlForm; import com.gargoylesoftware.htmlunit.html.HtmlPage; import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput; import com.gargoylesoftware.htmlunit.html.HtmlTextInput; public class Test { public static void main(String[] args) { try { WebClient client=new WebClient(BrowserVersion.FIREFOX_10); HtmlPage page=client.getPage("http://www.baidu.com/"); HtmlForm form = page.getFormByName("f"); HtmlTextInput text= form.getInputByName("wd"); HtmlSubmitInput submit = form.getInputByValue("百度一下"); text.setValueAttribute("root"); HtmlPage page2=submit.click(); System.out.println(page2.asXml()); } catch (FailingHttpStatusCodeException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
结果就不列出了
(2) 得到元素的方法有很多 下面写的是根据 Attribute 的方法
List<HtmlElement> body=page.getDocumentElement().getElementsByAttribute("div", "class", "item");
try { WebClient webClient=new WebClient(BrowserVersion.FIREFOX_10); //这一步是创建一个模拟浏览器,使用浏览器版本为FIREFOX10.0,可以更改,如果 //使用这个浏览器不能解决问题的时候,可以更换CHROME or IE URL url; url = new URL("http://www.baidu.com"); //创建一个url连接 HtmlPage page = webClient.getPage(url); //使用模拟浏览器对这个链接发送请求 HtmlInput input=(HtmlInput)page.getDocumentElement().getElementsByAttribute("input", "id", "kw").get(0); //获取输入框 input.setAttribute("value", "哪儿买"); //然后设置输入框的属性值 HtmlInput active=(HtmlInput) page.getDocumentElement().getElementsByAttribute("input","id","su").get(0); //获取你需要操纵的那个按钮 HtmlPage result=active.click(); //然后触发按钮上绑定的javascript事件,得到一个新的页面,这个页面就是从服务器//响应得到的 System.out.println(result.asXml()); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }