• 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是一个比较方便简洁的工具.
  • 相关阅读:
    phalapi框架where条件查询
    yii2学习网站
    改变yii2 $form最外层div样式
    PHP库(数据抓取)
    yii框架场景的用法
    Yii框架数据查询
    更改控制台编码格式
    打开yii2控制台命令
    过滤器实现登录拦截
    SSM整合
  • 原文地址:https://www.cnblogs.com/qlqwjy/p/8881433.html
Copyright © 2020-2023  润新知