网页解析利器——HtmlUnit

网页解析利器——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还是比较好用的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值