网页解析利器——HtmlUnit

来源:互联网 发布:汽车单片机控制灯光 编辑:程序博客网 时间:2024/05/16 18:29

网页解析利器——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还是比较好用的。
原创粉丝点击