使用 htmlunit 来获取页面数据
在 pom.xml 中添加依赖
<dependencies>
<dependency>
<groupId>net.sourceforge.htmlunit</groupId>
<artifactId>htmlunit</artifactId>
<version>2.44.0</version>
</dependency>
<dependency>
<groupId>net.sourceforge.htmlunit</groupId>
<artifactId>htmlunit-cssparser</artifactId>
<version>1.6.0</version>
</dependency>
<dependency>
<groupId>net.sourceforge.htmlunit</groupId>
<artifactId>htmlunit-core-js</artifactId>
<version>2.44.0</version>
</dependency>
</dependencies>
java 代码
//爬取页面数据
public void crawlData() {
WebClient webClient = new WebClient(BrowserVersion.CHROME);// 新建一个模拟谷歌Chrome浏览器的浏览器客户端对象
webClient.getOptions().setThrowExceptionOnScriptError(false);// 当JS执行出错的时候是否抛出异常, 这里选择不需要
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);// 当HTTP的状态非200时是否抛出异常, 这里选择不需要
webClient.getOptions().setActiveXNative(false);
webClient.getOptions().setTimeout(30000);
webClient.getOptions().setCssEnabled(false);// 是否启用CSS, 因为不需要展现页面, 所以不需要启用
webClient.getOptions().setJavaScriptEnabled(false); // 很重要,启用JS
webClient.getOptions().setDownloadImages(false);
webClient.setAjaxController(new NicelyResynchronizingAjaxController());// 很重要,设置支持AJAX
webClient.getOptions().setMaxInMemory(-1);
// 3 启动客户端重定向
webClient.getOptions().setRedirectEnabled(true);
// 8设置cookie
webClient.getCookieManager().setCookiesEnabled(true);
try {
HtmlPage page = (HtmlPage) webClient.getPage("url地址");
//-------常用获取元素方法---------
HtmlForm form = page.getForms().get(0); //获取网页中的第一个form表单
HtmlInput input = form.getInputByName("inputName");//通过 input 的 name 属性获取元素
input.setValueAttribute("value"); //给 input 设置值
String s = input.asText(); //获取input 的值
System.out.println(s);
HtmlInput inputValue = form.getInputByValue("inputValue"); //通过input值获取元素
DomElement domId = page.getElementById("domId");//通过元素的id属性获取元素
DomNodeList<DomElement> divList = page.getElementsByTagName("div"); //通过元素名获取元素集合
DomNode domNode = page.querySelector(".className"); //通过class获取元素,默认获取第一个
DomNodeList<DomNode> domNodeList = page.querySelectorAll(".className"); //通过class获取元素集合
//-------------------------------
//----当遇到需要点击查询获取数据的页面----
HtmlPage page1 = (HtmlPage) page.getElementById("buttonId").click(); //获取可以点击的元素(可通过任意方法获取,这里使用id获取),调用方法获得新的页面
synchronized (page1) { //此句代码解决点击后获取新的页面,此页面数据是在js中渲染
page1.wait(5000);
}
//当遇到需要获取 iframe 下的数据信息
String src = page1.getElementsByTagName("iframe").get(0).getAttribute("src"); //获取iframe的src值
HtmlPage page2 = (HtmlPage) webClient.getPage(src); //重新获取页面,如若src不是一个完成的地址,可以拿原先的域名+src尝试获取
//---------------------------------
} catch (Exception e) {
e.printStackTrace();
}
}
细点描述
此方法爬取页面数据跟javascript很类似,首先通过webClient.getPage(“”)方法获取到页面,再通过id名称、class名称、元素名、元素值等方法获取元素,再通过asText()方法获取字符串类型值