博主
258
258
258
258
专辑

第五节 Jsoup+HtmlUnit获取懒加载图片数据

亮子 2022-02-22 06:56:12 7127 0 0 0

htmlunit 是一款开源的java 页面分析工具,读取页面后,可以有效的使用htmlunit分析页面上的内容。项目可以模拟浏览器运行,被誉为java浏览器的开源实现。是一个没有界面的浏览器,运行速度迅速。是junit的扩展之一

1、引擎介绍

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

2、主要用途

常规意义上,该项目可以用来进行页面的测试工作,实现网页自动化测试,(包括JS)
但是一般来说,在小型爬虫项目中,这种框架十分常用,可以有效的分析出 dom的标签,并且有效的运行页面上的js以便得到一些需要执行JS才能得到的值。

3、Jsoup+HtmlUnit获取懒加载图片地址

1)、添加依赖

        <dependency>
            <!-- jsoup HTML parser library @ https://jsoup.org/ -->
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.14.3</version>
        </dependency>

        <!-- https://htmlunit.sourceforge.io/-->
        <dependency>
            <groupId>net.sourceforge.htmlunit</groupId>
            <artifactId>htmlunit</artifactId>
            <version>2.58.0</version>
        </dependency>

2)、HtmlUnit定义获取页面函数

    private String getJdHtml() {
        List list = new ArrayList<String>();

        String typhoonWeatherUrl="https://www.abc.com/";

        try {

            WebClient wc = new WebClient(BrowserVersion.CHROME);

            // 启用JS解释器,默认为true
            wc.getOptions().setJavaScriptEnabled(true);

            // 禁用css支持
            wc.getOptions().setCssEnabled(false);

            // js运行错误时,是否抛出异常
            wc.getOptions().setThrowExceptionOnScriptError(false);

            // 状态码错误时,是否抛出异常
            wc.getOptions().setThrowExceptionOnFailingStatusCode(false);

            // 设置连接超时时间 ,这里是5S。如果为0,则无限期等待
            wc.getOptions().setTimeout(5000);

            // 是否允许使用ActiveX
            wc.getOptions().setActiveXNative(false);

            // 等待js时间
            wc.waitForBackgroundJavaScript(1 * 1000);

            // 设置Ajax异步处理控制器即启用Ajax支持
            wc.setAjaxController(new NicelyResynchronizingAjaxController());

            // 不跟踪抓取
            wc.getOptions().setDoNotTrackEnabled(false);

            // 访问页面
            HtmlPage page = wc.getPage(typhoonWeatherUrl);

            // 以xml的形式获取响应文本
            String pageXml = page.asXml();
            System.out.println(pageXml);

            //Document document = Jsoup.parse(pageXml);
            return pageXml;
        }
        catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

3)、jsoup解析页面提取数据

    @Test
    void getJdProduct() {
        //--1
        String jdHtml = getJdHtml();
        if(jdHtml == null) {
            System.out.println("抓取网页失败");
            return;
        }

        //--2
        Document doc = Jsoup.parse(jdHtml);
        Element j_goodsList = doc.getElementById("J_goodsList");

        //--3 通过class获取产品列表
        Elements glItems = j_goodsList.getElementsByClass("gl-item");
        glItems.forEach(e -> {
            // 产品名称
            Elements pNameClass = e.getElementsByClass("p-name");
            String pName = pNameClass.first().text();
            System.out.println(pName);

            // 产品价格
            Elements pPriceClass = e.getElementsByClass("p-price");
            Elements iTag = pPriceClass.first().getElementsByTag("i");
            String pPrice = iTag.first().text();
            //String pPrice = pPriceClass.first().text();
            System.out.println(pPrice);

            // 产品图片
            Elements pImgClass = e.getElementsByClass("p-img");
            Elements img = pImgClass.first().getElementsByTag("img");
            String attr = img.first().attr("data-lazy-img");
            System.out.println(attr);

        });
    }