您的位置:首页 > Web前端 > HTML

网页解析利器——HtmlUnit

2017-06-11 08:34 127 查看

网页解析利器——HtmlUnit

最近做京津冀路网的爬取,遇到一个很麻烦的问题,就是很多网页上有js脚本,用普通的,例如HtppClient,根本无法做到解析js脚本,后来,百度了一下,找到了一个,是Java从jdk5之后扩展的ScriptEngineManager,
使用如下方法


ScriptEngineManager manager = new ScriptEngineManager();
  // 得到javascript脚本引擎
  ScriptEngine engine = manager.getEngineByName("javascript");
  try
  {
  // 开始运行脚本,并返回当前的小时
  Double hour = (Double)engine.eval("var date = new Date();" +"date.getHours();");


这种Java自带的虽然不用导入外部的包,但是在实际开发中,这种API经常会报找不到window、document等等,因为ScriptEngineManager里面并没有解析js的引擎,所以这种方案只得作废。
jsoup是号称解析网页很强大的工具,但是只能解析静态的网页,同样不能解析动态的网页。
这时候,用到了一个开源的网页分析工具,HtmlUnit,这种工具自带有js的解析和css的解析,能够很好的解析出带有js的网页,但是一个缺点就是解析网页的速度太慢,因为要解析js,所以解析网页的速度就慢下来了,如果有时候业务需要不用解析js的话,可以选择关闭js解析和css解析器,这样解析网页速度会比较快了,代码如下:


public static void main(String[] args) throws Exception{
String str;
//创建一个webclient
WebClient webClient = new WebClient();
//htmlunit 对css和javascript的支持不好,所以请关闭之
webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setCssEnabled(false);
//获取页面
HtmlPage page =     webClient.getPage("http://www.baidu.com/");
//获取页面的TITLE
str = page.getTitleText();
System.out.println(str);
//获取页面的XML代码
str = page.asXml();
System.out.println(str);
//获取页面的文本
str = page.asText();
System.out.println(str);
//关闭webclient
webClient.closeAllWindows();
}


如果想要解析网页中的js,那么就不用关闭js和css解析器,在HtmlUnit中,这两个功能默认是开启的,网上找资料中,看到很多人说用HtmlUnit解析js并不起作用,这是因为HtmlUnit解析的时候,时间会比较长,有时候还没等程序解析完,就执行了输出结果的程序,所以,最终看不到解析后的结果,所以,可以暂时将该线程挂起,或者让当前线程睡眠一段时间,再去获取结果,优化方案如下:


// 新建一个web客户端
WebClient webClient = new WebClient(BrowserVersion.FIREFOX_52);
// 解析获取的页面
HtmlPage page = webClient.getPage("https://www.baidu.com");
Thread.sleep(10000);
System.out.println("------获取的网页------");
System.out.println(page.asXml());
webClient.close();


所以,HtmlUnit还是比较好用的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息