【Java-Crawler】爬取动态页面(HtmlUnit、WebMagic)

news/2024/7/19 11:41:21 标签: java, 爬虫, javascript

爬取动态页面(WebMagic、HtmlUnit)

  • 一、HtmlUnit的基本使用
    • 引入依赖
    • 一般使用步骤
    • WebClient 的一些配置(上述一般步骤中的第二步)
  • 二、案例(爬取CSDN首页)测试(WebMagic+HtmlUnit)
  • 三、总结

上次提出了用 Selenium+浏览器驱动 去模拟浏览器的行为,然后去爬取动态页面(爬取动态页面(WebMagic、Selenium、ChromeDriver))。但是真的是太慢太慢了,而且 WebMagic 很多特性都用不了了,比如:多线程去处理请求、使用Pipeline去对结果集进行处理、请求去重…WebMagic最后被用成了HttpClient、Jsoup,失去了框架的意义。(也有可能是小编没合理地去模块化,但慢是真慢)

所以这里提出一个简单易用的工具——HtmlUnit,它可以模拟浏览器的行为,支持JavaScript解析和执行,可以用于解析动态页面。但它解析JavaScript的时候也是比较慢的,但后续用 WebMagic 去处理静态页面就快起来了。就比如说处理某网站的主页(动态页面)是需要解析JavaScript的,但主页里面的超链接对应的网页是静态网页,这时就可以直接用WebMagic去处理就可以了,速度就有了。

这里得说明一下 HtmlUnit 的缺点,方便后面讲解其使用:

  • 不支持所有的动态页面:虽然 HTMLUnit 可以处理 JavaScript 和 AJAX,但是它并不支持所有的动态页面。一些高度复杂的动态页面可能会导致 HTMLUnit 无法正确解析页面。(比如:51job)
  • 缺乏可视化界面:HTMLUnit 是一个 GUI-less浏览器,因此它缺乏可视化界面,这使得它不太适合用于测试和调试 Web 应用程序。(但咱这用的是去爬虫,所以问题应该不大)
  • 对JavaScript的支持并不完美:HTMLUnit 的 JavaScript 引擎不如一些主流浏览器的 JavaScript 引擎强大,所以当用 HtmlUnit 去解析的时候,可能会出现一些JavaScript的问题。(这个根据调试结果,自己应该做相应的调整选择)

一、HtmlUnit的基本使用

引入依赖

需要 htmlunit 依赖和 commons-io 这个工具依赖。

        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.11.0</version>
        </dependency>

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

一般使用步骤

java">// 1. 创建 WebClient 对象,模拟浏览器行为
WebClient client = new WebClient();
// 2. 对 client 进行一些配置
// 比如设置不需要解析css时
client.getOptions().setCssEnabled(false);
// 3. 打开网页(通过getPage(url)方法),该过程进行了解析
HtmlPage htmlPage = client.getPage(url);
// 4. 因为小编一般用它就是解析动态页面的,所以一般都是会解析JavaScript的
// 所以这里最好设一个解析script时间,让它充分得以解析
client.waitForBackgroundJavaScript(10*1000);// 10s
// 5. 获取解析后的页面html源代码字符串
String htmlStr = htmlPage.asXml();
// 6. 再利用webmagic中的Html类去构造Html对象去处理数据
Html html = new Html(htmlStr);
// 7. 关闭WebClient
client.close();

WebClient 的一些配置(上述一般步骤中的第二步)

  1. 开启JavaScript解析(默认是开启的)
java">client.getOptions().setJavaScriptEnabled(true);
  1. 关闭CSS解析(默认是开启的)
java">client.getOptions().setCssEnabled(false);
  1. 禁止抛出JavaScript错误,防止程序终止(默认是开启的)
java">client.getOptions().setThrowExceptionOnScriptError(false);
  1. 等待JavaScript执行完成(这个设在getPage方法后,对面上面的第四步)
java">client.waitForBackgroundJavaScript(10*1000);// 10s
  1. 设置浏览器的 User-Agent,反反爬虫策略之一。让浏览器觉得你不是爬虫用户访问的。
java">client.addRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3");

二、案例(爬取CSDN首页)测试(WebMagic+HtmlUnit)

爬取CSDN首页,案例代码

java">@Component
public class TestProcessor implements PageProcessor {
    @SneakyThrows
    @Override
    public void process(Page page) {
        if(page.getUrl().toString().equals(url)) {

            // 创建WebClient对象
            WebClient client = new WebClient();
            // 开启自动解析JavaScript
            client.getOptions().setJavaScriptEnabled(true);
            client.getOptions().setCssEnabled(false);
            client.getOptions().setThrowExceptionOnScriptError(false);
            // 打开网页,获取HtmlPage对象
            HtmlPage htmlPage = client.getPage(page.getUrl().toString());
            client.waitForBackgroundJavaScript(30000);
            // 页面源代码
            String s = htmlPage.asXml();

            Html html = new Html(s);
            // 获取当页职位url
            List<String> allUrl = html.css("html body div#app div div.main div.page-container.page-component div div.home_wrap div#floor-blog-index_747 div.floor-blog-index div.blog-content div.Community div.active-blog div.Community-item-active.blog div.Community-item.blog div.content a.blog","href").all();
            // 去获取数据、处理数据、保存数据
            for (String jurl : allUrl) {
                page.addTargetRequest(jurl);// 静态页面交给webmagic处理
            }
            client.close();
        }else{
            addSave(page);
        }

    }

    private void addSave(Page page) {
        // 获取对应的html对象
        Html jobHtml = page.getHtml();
        // 获取数据并保存数据
        
        // 存入数据库
        
    }

    private Site site = Site.me()
            .setRetryTimes(3)
            .setSleepTime(1000)
            .setTimeOut(3000)
            .setUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3");
    @Override
    public Site getSite() {
        return this.site;
    }

    // initialDelay 当任务启动后,等待多久执行方法
    // fixedDelay 每隔多久执行这个方法
    @Scheduled(initialDelay = 1000,fixedDelay = 100000)
    public void process(){
        Spider.create(new TestProcessor())
                .addUrl(url)
                .thread(5)
                .run();
    }
    private String url = "https://blog.csdn.net/?spm=1001.2101.3001.4477";
}

测试效果

首页JavaScript被解析后的 CSDN HTML 代码

在这里插入图片描述

首页博客超链接对应的博客网页(它是静态网页),其 HTML 代码解析如下图所示

在这里插入图片描述

三、总结

使用 HtmlUnit 去解析动态页面然后去爬虫是比较方便的,这是由于 HtmlUnit 工具易用的原因。但由于它存在 JavaScript 支持并不完美,外加有些动态页面它也是解析不了的缺陷,使用 Selenium+浏览器驱动 这种方式也不能说就比 HtmlUnit 解析要差。

爬虫使用’工具’总结就是:

  • 静态页面直接用 Webmagic;
  • 动态页面如果可以用 HtmlUnit 就用 HtmlUnit;
  • HtmlUnit 完成不了的再用 Selenium+浏览器驱动。

还有就是小编发现很多网站首页是动态页面的,但动态网页里超链接对应的页面一般是静态网页的。(小编没说绝对哈,一般是这样的)


http://www.niftyadmin.cn/n/362261.html

相关文章

这才是网络安全最系统的学习路线(建议收藏)

01 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面…

PMP认证与企业项目管理的进化之旅

PMP发展历史 随着时间的推移&#xff0c;PMP认证不断演进&#xff0c;与之相应的&#xff0c;企业项目管理环境也发生了巨大的变化。让我们回顾一下每个版本的发布时间&#xff0c;并探索在相应的时期内企业项目管理中发生的变化。 PMP 1st Edition于1987年发布&#xff0c;当…

《深度思维》跨越式*

参考&#xff1a; https://www.zhihu.com/tardis/zm/art/410244111?source_id1005 从思维的技术到思维的格局&#xff0c;再到专注努力与漫长人生中坚忍的精神图腾&#xff0c;作者通过方法理论与案例相结合&#xff0c;介绍了深度思思维的学习方法。 深度思维简介 拥有较长的…

openGauss Developer Day 2023 | 邀您参加oGSP运维服务分论坛

oGSP运维服务分论坛 5月26日13:30-15:30 oGSP是由openGauss社区从服务体系、服务内容、服务经验、服务承诺四个维度&#xff0c;对数据库运维服务商进行能力评估后&#xff0c;遴选推荐的优质服务伙伴。为使用openGauss社区版、行业用户自用版及商业发行版的用户提供长期稳定…

【VR】手柄定位技术

1. 关于Quest Pro头显、控制器的规格分析&#xff08;终篇&#xff09;及Quest 3分辨率 &#xff08;2022年07月29日&#xff09;被认为是“Quest Pro”的高端一体机Project Cambria将于今年秋季正式发布。对于一直关注和分享所述设备情报的YouTuber布拉德利林奇&#xff08;B…

可视化规则引擎

urule 开源和商业版 源码&#xff1a;https://gitee.com/mirrors/URule 教程&#xff1a;https://www.bstek.com/resources/doc/3.x/2an-zhuang-yu-pei-zhi.html

一大波物联网毕业设计选题推荐(配套源码、文档、开发板)

以下项目整体综合性比较强&#xff0c;更贴近于产品化&#xff0c;并且基本都包含微信小程序与物联网云平台的联动&#xff0c;每个项目均配套详细的项目开发文档、程序源码&#xff0c;非常适合作为物联网毕业设计选题。项目文档及源码在文章末尾可免费下载。 另外&#xff0…

操作系统的基本概念 - 死锁

文章目录 1 概述1.1 基本概念1.2 产生死锁的四个必要条件 2 死锁2.1 判断死锁&#xff1a;资源、进程、需求 1 概述 1.1 基本概念 死锁&#xff08;Dead Lock&#xff09; &#xff1a;两个或两个以上的进程在执行过程中&#xff0c;因争夺资源而造成的一种互相等待的现象&am…