• HtmlUnit入门一


    htmlunit 是一款开源的java 页面分析工具,读取页面后,可以有效的使用htmlunit分析页面上的内容。

    项目可以模拟浏览器运行,被誉为java浏览器的开源实现。是一个没有界面的浏览器。

    采用的是Rhinojs引擎。模拟js运行。

    使用htmlunit抓取网页大概可以分为以下几个步骤:

    1、定义一个WebClient客户端。

      就相当于定义了一个没有界面的浏览器。

    2、使用WebClient客户端从指定URL获取HtmlPage。

      HtmlPage中包含目标URL页面中的所有信息。

    3、从HtmlPage中获取我们需要的指定元素。

    下面就来看一个实例:

    package com.fuwh;
    
    import com.gargoylesoftware.htmlunit.WebClient;
    import com.gargoylesoftware.htmlunit.html.HtmlPage;
    
    public class Demo01 {
    
        public static void main(String[] args) {
            
            WebClient webClient=null;
            try {
                 webClient= new WebClient();    //定义一个默认的WebClient
                HtmlPage page=webClient.getPage("https://www.cnblogs.com/");    //从指定URL获取HtmlPage
                System.out.println(page.asText());    //将HtmlPage转换成字符串打印出来
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }finally {
                webClient.close();    //关闭客户端
            }
        }
    }

    上面的实例中,我们创建的是一个默认的WebClient实例,使WebClient#getBrowserVersion()方法,可以看到,

    默认创建的是Chrome版本的浏览器。

    当然,我们也可以在创建的时候指定浏览器的版本。

    例子:

    package com.fuwh;
    
    import com.gargoylesoftware.htmlunit.BrowserVersion;
    import com.gargoylesoftware.htmlunit.WebClient;
    import com.gargoylesoftware.htmlunit.html.HtmlPage;
    
    public class Demo01 {
    
        public static void main(String[] args) {
            
            WebClient webClient=null;
            try {
                 webClient= new WebClient(BrowserVersion.FIREFOX_45);    //定义一个WebClient
                HtmlPage page=webClient.getPage("https://www.cnblogs.com/");    //从指定URL获取HtmlPage
                System.out.println(page.asText());    //将HtmlPage转换成字符串打印出来
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }finally {
                webClient.close();    //关闭客户端
            }
        }
    }

    在BrowserVersion中,定义了很多种浏览器的版本。

    在获得一个HtmlPage之后,相对于把整个页面打出来,我们还是更希望能够找出我们想要的元素。

    HtmlUnit对于查找指定元素也提供了丰富的支持。

    支持使用DOM,CSS和XPath(推荐)的方式。

    使用DOM方式

    package com.fuwh;
    
    import com.gargoylesoftware.htmlunit.BrowserVersion;
    import com.gargoylesoftware.htmlunit.WebClient;
    import com.gargoylesoftware.htmlunit.html.DomElement;
    import com.gargoylesoftware.htmlunit.html.DomNodeList;
    import com.gargoylesoftware.htmlunit.html.HtmlAnchor;
    import com.gargoylesoftware.htmlunit.html.HtmlDivision;
    import com.gargoylesoftware.htmlunit.html.HtmlPage;
    
    public class Demo01 {
    
        public static void main(String[] args) {
            
            WebClient webClient=null;
            try {
                 webClient= new WebClient(BrowserVersion.FIREFOX_45);    //定义一个WebClient
                final HtmlPage page=webClient.getPage("https://www.cnblogs.com/");    //从指定URL获取HtmlPage
                
                /**
                 * DomElement 的子类:HtmlElement
                 * HtmlElemnt也有很多子类,基本上涵盖了所有的Html元素
                 * 例如:HtmlDivision,HtmlInput
                 */
                System.out.println("=============================================");
                //通过id获取指定DOM元素
                HtmlDivision htmlDiv=(HtmlDivision) page.getElementById("header");
                System.out.println(htmlDiv.asXml());
    
                System.out.println("=============================================");
                //通过tagName来获取元素集合
                DomNodeList<DomElement> nodeList=page.getElementsByTagName("a");
                for (DomElement domElement : nodeList) {
                    HtmlAnchor htmlAnchor=(HtmlAnchor) domElement;
                    System.out.println("标题:"+htmlAnchor.asText()+"   -->   地址:"+htmlAnchor.getAttribute("href"));
                }
                
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }finally {
                webClient.close();    //关闭客户端
            }
        }
    }

    使用CSS方式

    package com.fuwh;
    
    import com.gargoylesoftware.htmlunit.BrowserVersion;
    import com.gargoylesoftware.htmlunit.WebClient;
    import com.gargoylesoftware.htmlunit.html.DomElement;
    import com.gargoylesoftware.htmlunit.html.DomNodeList;
    import com.gargoylesoftware.htmlunit.html.HtmlAnchor;
    import com.gargoylesoftware.htmlunit.html.HtmlDivision;
    import com.gargoylesoftware.htmlunit.html.HtmlPage;
    
    public class Demo02 {
    
        public static void main(String[] args) {
            
            WebClient webClient=null;
            try {
                 webClient= new WebClient(BrowserVersion.FIREFOX_45);    //定义一个WebClient
                final HtmlPage page=webClient.getPage("https://www.cnblogs.com/");    //从指定URL获取HtmlPage
                
                HtmlDivision htmlDiv =page.querySelector("div");//获取第一个div
                System.out.println(htmlDiv.asXml());
                
                System.out.println("====================================");
                
                HtmlDivision htmlDiv2=page.querySelector("div#footer_bottom");//也可以指定多个选择器,通过‘,’隔开
                System.out.println(htmlDiv2.asXml());
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }finally {
                webClient.close();    //关闭客户端
            }
        }
    }

    使用XPath方式

    package com.fuwh;
    
    import java.util.List;
    
    import com.gargoylesoftware.htmlunit.BrowserVersion;
    import com.gargoylesoftware.htmlunit.WebClient;
    import com.gargoylesoftware.htmlunit.html.HtmlDivision;
    import com.gargoylesoftware.htmlunit.html.HtmlPage;
    
    public class Demo03 {
    
        public static void main(String[] args) {
            
            WebClient webClient=null;
            try {
                 webClient= new WebClient(BrowserVersion.FIREFOX_45);    //定义一个WebClient
                final HtmlPage page=webClient.getPage("https://www.cnblogs.com/");    //从指定URL获取HtmlPage
                
                List<HtmlDivision> divList=page.getByXPath("//div[@id='cnblogs_a1']");
                for (HtmlDivision htmlDivision : divList) {
                    System.out.println("***********************************************8");
                    System.out.println(htmlDivision.asXml());
                }
                
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }finally {
                webClient.close();    //关闭客户端
            }
        }
    }
  • 相关阅读:
    laravel的workflow流程插件
    [php]laravel框架容器管理的一些要点
    laravel 自带消息notification通知
    laravel5.5的定时任务详解(demo)
    Laravel核心代码学习
    laravel 加载指定版本的mongodb
    Linux安装Composer
    composer全量镜像使用方法
    laravel在github地址
    node anyproxy ssi简易支持
  • 原文地址:https://www.cnblogs.com/zerotomax/p/7255950.html
Copyright © 2020-2023  润新知