HtmlUnit是一个无界面浏览器Java程序,可以很便捷的操作网页,就是我们常说的爬虫。它为HTML文档建模,提供了调用页面、填写表单、单击链接等操作的API。就跟你在浏览器里做的操作一样。
Httpclient+jsoup也是能够爬取一些我们常需要的数据,但是还是有一些缺陷,比如有些页面数据是js加载出来的 httpclient解析不出来,比如百度云用户页面,淘宝页面,连开源中国博客的博客内容都是Js加载或者处理的,所以httpClient是解析不出来的,这里htmlunit就是一个很好的方案,内嵌js浏览器,模拟Js运行,把结果执行出来。
下面是我爬取的疫情数据,包括了一些获取常规元素的方法
package com.xmy.cn;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomElement;
import com.gargoylesoftware.htmlunit.html.DomNodeList;
import com.gargoylesoftware.htmlunit.html.HtmlListItem;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
public class test
{
public static void main(String[] args) throws InterruptedException
{
WebClient webClient = new WebClient(BrowserVersion.CHROME);
//取消js css支持
webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setCssEnabled(false);
HtmlPage page;
try {
//获取需要解析的页面
page = webClient.getPage("https://m.medsci.cn/wh.do");
Thread.sleep(1000); // 休息10秒钟
//获取页面全部文本
// System.out.println(page.asText());
//====根据tag名称 查询所需数据===//
//HTML中tag是由尖括号包围的关键词,比如 <html>
DomNodeList<DomElement> aList = page.getElementsByTagName("p");
// for(int i=0;i<aList.getLength();i++)
// {
// DomElement a=aList.get(i);
// System.out.println(a.asText());
// }
//标题
DomElement a = aList.get(0);
System.out.println(a.asText());
//===xpath方式查询所需数据===//
//确诊人数
HtmlListItem item1 = (HtmlListItem) page.getByXPath("//ul['count_list']/li").get(0);
//疑似人数
HtmlListItem item2 = (HtmlListItem) page.getByXPath("//ul['count_list']/li").get(1);
//死亡人数
HtmlListItem item3 = (HtmlListItem) page.getByXPath("//ul['count_list']/li").get(3);
//治愈人数
HtmlListItem item4 = (HtmlListItem) page.getByXPath("//ul['count_list']/li").get(4);
System.out.println("确诊人数: "+item1.asText());
System.out.println("疑似人数: "+item2.asText());
System.out.println("死亡人数: "+item3.asText());
System.out.println("治愈人数: "+item4.asText());
} catch (FailingHttpStatusCodeException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
//释放资源
webClient.closeAllWindows();
}
}
}
输出结果:
截至 2020-2-5 21:37:27 数据统计
确诊人数: 24511确诊
疑似人数: 15625疑似
死亡人数: 490死亡
治愈人数: 901治愈