htmlunit爬虫工具使用--模拟浏览器发送请求,获取JS动态生成的页面内容

Htmlunit是一款模拟浏览抓取页面内容的java框架,具有js解析引擎(rhino),可以解析页面的js脚本,得到完整的页面内容,特殊适合于这种非完整页面的站点抓取。

下载地址:

  https://sourceforge.net/projects/htmlunit/files/htmlunit/

 

maven地址:

        <dependency>
            <groupId>net.sourceforge.htmlunit</groupId>
            <artifactId>htmlunit</artifactId>
            <version>2.18</version>
        </dependency>

 

 

代码的实现非常简单,主要分为两种常用场景:

  1. 解析页面的js
  2. 不解析页面的js

 

package cn.qlq.craw.httpunit;

import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
/**
 * httpunit爬虫
 * @author liqiang
 *
 */
public class HttpUnitCraw {  
    
    public static void main(String[] args) throws Exception {  
        HttpUnitCraw crawl = new HttpUnitCraw();  
        String url = "http://qiaoliqiang.cn/";  
        System.out.println("----------------------抓取页面时不解析js-----------------");  
        crawl.crawlPageWithoutAnalyseJs(url);  
        System.out.println("----------------------抓取页面时解析js-------------------");  
        crawl.crawlPageWithAnalyseJs(url);
    }  
      
    /** 
     * 功能描述:抓取页面时不解析页面的js 
     * @param url 
     * @throws Exception  
     */ 
    public void crawlPageWithoutAnalyseJs(String url) throws Exception{  
        //1.创建连接client   
        WebClient webClient = new WebClient(BrowserVersion.CHROME);  
        //2.设置连接的相关选项  
        webClient.getOptions().setCssEnabled(false);  
        webClient.getOptions().setJavaScriptEnabled(false);  
        webClient.getOptions().setTimeout(10000);  
        //3.抓取页面  
        HtmlPage page = webClient.getPage(url);  
        System.out.println(page.asXml());  
        //4.关闭模拟窗口  
        webClient.closeAllWindows();  
    }  
      
    /** 
     * 功能描述:抓取页面时并解析页面的js 
     * @param url 
     * @throws Exception  
     */
    public void crawlPageWithAnalyseJs(String url) throws Exception{  
        //1.创建连接client   
        WebClient webClient = new WebClient(BrowserVersion.CHROME);  
        //2.设置连接的相关选项  
        webClient.getOptions().setCssEnabled(false);  
        webClient.getOptions().setJavaScriptEnabled(true);  //需要解析js  
        webClient.getOptions().setThrowExceptionOnScriptError(false);  //解析js出错时不抛异常  
        webClient.getOptions().setTimeout(10000);  //超时时间  ms  
        //3.抓取页面  
        HtmlPage page = webClient.getPage(url);  
        //4.将页面转成指定格式  
        webClient.waitForBackgroundJavaScript(10000);   //等侍js脚本执行完成  
        System.out.println(page.asXml());  
        //5.关闭模拟的窗口  
        webClient.closeAllWindows();  
    }  
} 
 
主要关注webClient的几个选项配置,
webClient.getOptions().setJavaScriptEnabled(true);  //需要解析js  
webClient.getOptions().setThrowExceptionOnScriptError(false);  //解析js出错时不抛异常  

 


需要将这两个开关打开才可以解析页面的js,css的渲染默认关掉就可以,因为爬虫本身没有界面,所以这块不需要,即下面的配置:
webClient.getOptions().setCssEnabled(false);  

 

 

 
 
htmlunit在解析js的时候也有可能失败,这块还没有深入研究,后续使用遇到问题再记录
 
抓取到的内容默认以xml形式获得,即page.asXml(), 因为这样可以通过jsoup去解析html页面数据,jsoup是一个比较方便简洁的工具.

 

posted @ 2018-04-19 11:49  QiaoZhi  阅读(5778)  评论(0编辑  收藏  举报