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

news2024/11/24 5:37:53

爬取动态页面(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>

一般使用步骤

// 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解析(默认是开启的)
client.getOptions().setJavaScriptEnabled(true);
  1. 关闭CSS解析(默认是开启的)
client.getOptions().setCssEnabled(false);
  1. 禁止抛出JavaScript错误,防止程序终止(默认是开启的)
client.getOptions().setThrowExceptionOnScriptError(false);
  1. 等待JavaScript执行完成(这个设在getPage方法后,对面上面的第四步)
client.waitForBackgroundJavaScript(10*1000);// 10s
  1. 设置浏览器的 User-Agent,反反爬虫策略之一。让浏览器觉得你不是爬虫用户访问的。
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首页,案例代码

@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.coloradmin.cn/o/571860.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人机交互技术在车管所的应用探索

车管所作为交通管理的重要机构&#xff0c;承担着车辆登记、驾驶证办理、年检等重要职责&#xff0c;其工作效率和服务质量对于保障道路交通安全和畅通至关重要。而人机交互技术作为一种新兴的技术手段&#xff0c;可以为车管所提供更加高效、便捷的服务。因此&#xff0c;本文…

ESD防静电监控系统后台实时掌控现场静电防护情况

当静电积累到一定程度时&#xff0c;它可能会产生电击&#xff0c;从而对工人造成伤害。因此&#xff0c;工厂应该采取必要的预防措施&#xff0c;如提供防静电鞋和衣服&#xff0c;以保护工人免受静电伤害。 ESD防静电监控系统实现工业4.0技术要求&#xff0c;ESD物联技术稳定…

chatgpt赋能python:Python编程:接口程序的SEO优化方法

Python编程&#xff1a;接口程序的SEO优化方法 简介 接口程序是现代软件开发不可或缺的一部分&#xff0c;为应用程序提供外部数据访问和交互的方式。Python是一种功能强大的编程语言&#xff0c;在接口开发中也得到了广泛应用。本文将介绍如何使用Python编写有效的接口程序并…

新形式下安科瑞智能配网监控系统的应用研究

安科瑞 徐浩竣 江苏安科瑞电器制造有限公司 zx acrelxhj 摘要&#xff1a;随着经济和科技水平的快速发展&#xff0c;大型建筑变电所、配电房数量较多&#xff0c;分布区域广&#xff0c;配电运维部门人员对配电房的运维管理基本停留在传统的定期巡视、周期性检修、故障抢修…

对于质量保障,前端职能该做些什么?

目录 前言 1. 背景 2. 分析 2.1 前端自动化测试工具 2.1.1 针对工程代码的静态检查 2.1.2 针对部署产物的检查 2.1.3 性能测试 2.1.4 错误检测 2.1.5 容灾&#xff08;白屏&#xff09;检测 2.2 devOps 流程关联 2.2.1 提测卡点 2.2.2 发布卡点 3. 总结 3.1 严选…

RabbitMQ消息持久化机制

上一篇说到生产者消息确认机制&#xff0c;它可以确保消息投递到RabbitMQ的队列中&#xff0c;但是消息发送到RabbitMQ以后&#xff0c;如果MQ宕机&#xff0c;也可能导致消息丢失&#xff0c;所以提出了消息持久化。持久化的主要机制就是将信息写入磁盘&#xff0c;当RabbtiMQ…

机械师曙光16电脑开机自动蓝屏怎么解决?

机械师曙光16电脑开机自动蓝屏怎么解决&#xff1f;有的用户在使用机械师曙光16电脑的时候&#xff0c;遇到了一些系统问题&#xff0c;导致自己无法正常的开机使用电脑。因为电脑总会变成蓝屏&#xff0c;无法进行任何操作。那么这个情况怎么去进行问题的解决呢&#xff1f;来…

字节内部又推出最新spring进阶全家桶了!强烈建议人手一份!

前言 一份 Alibaba 内部强烈推荐的“玩转 Spring 全家桶的 PDF” &#xff0c;小编也不是个吝啬的人&#xff0c;好的东西当然要一起分享咯。今天小编就带你一站通关 Spring全家桶&#xff0c;让你一路通关轻松斩获大厂 Offer&#xff01; Spring 框架自 2002 年诞生以来一直…

如何真正开启docker远程访问2375

注意看官方文档 Configure remote access for Docker daemon | Docker Documentation 1. windows上Docker Desktop开启远程访问端口2375 系统版本&#xff1a; win10专业版 Docker Desktop版本&#xff1a;4.18.0 很简单勾上&#xff0c; 应用并重启即可 2. linux上开启 尝…

中兴通讯5G荣登《财富》2023年中国ESG影响力榜单

日前&#xff0c;《财富》正式对外公布“2023年中国ESG影响力榜单”&#xff0c;中兴通讯5G榜上有名&#xff0c;旨在表彰其在绿色发展、社会责任、公司治理方面做出的努力与贡献&#xff0c;值得一提的是&#xff0c;“中国ESG影响力榜单”是《财富》在去年创立的榜单&#xf…

怎么把ppt压缩到10m以内?

怎么把ppt压缩到10m以内&#xff1f;众所周知&#xff0c;压缩文件可以使得文件更加易于传输和存储。在PPT演示过程中&#xff0c;如果文件过大&#xff0c;可能会导致文件传输、下载或存储的速度变慢&#xff0c;影响用户使用体验。将PPT压缩到10M可以避免这种情况&#xff0c…

SY8205同步降压DCDC可调电源模块(原理图和PCB)

SY8205同步buck降压电源模块&#xff0c;输入电压4.5-30V&#xff0c;输出电压0.6-30V可调&#xff0c;效率90%以上&#xff0c;最大连续输出电流5A&#xff0c;峰值电流6A。 开源链接&#xff1a;https://url.zeruns.tech/obGu3 SY8025数据手册下载地址&#xff1a;https://…

【Go语言从入门到实战】面向对象编程篇

面向对象编程 Go语言的面向对象编程和其他语言有非常大的差别。 Go 是一种面向对象的语言吗&#xff1f; 是和不是。虽然 Go 有类型和方法&#xff0c;并允许面向对象的编程风格&#xff0c;但没有类型层次结构&#xff08;继承&#xff09;。Go 中的“接口”概念提供了一种不…

springboot+vue学生综合测评系统(java项目源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的学生综合测评系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风…

electron更新机制

说明: 本文适用于win和mac这两个端mac端若要调试更新功能, 一定要把旧版本和新版本都配置mac的代码签名, 至于怎么配置, 主要就是先成为苹果开发者&#xff0c;然后去帐号那边下一个证书, 然后..... 一. 在package.json配置更新参数 参考: Publish - electron-builder &quo…

六级备考23天|CET-6|翻译技巧5-2|2019年12月真题|翻译荷花lotus|11:05-12:05

目录 一、中文 句子1 PRACTICE ANSWER 句子2 PRACTICE ANSWER 句子3 ​ PRACTICE ANSWER 句子4 PRACTICE ANSWER 句子5 PRACTICE ANSWER 句子6 PRACTICE ANSWER ​ 答案整合​ 一、中文 句子1 荷花是中国的名花之一&#xff0c;深受人们喜爱。 PRACTICE Lotus is one…

使用nvm管理node多版本(安装、卸载nvm,配置环境变量,更换npm淘宝镜像)

目录 前言一、卸载node二、nvm是什么&#xff1f;三、nvm安装1. 官网下载 nvm 包2. 安装 nvm-setup.exe小tips 3. 配置路径和下载镜像4. 检查nvm是否安装完成 四、使用nvm安装node版本五、修改npm默认镜像源为淘宝镜像六、 环境变量配置1. 设置系统变量和用户变量的作用是什么呢…

led显示屏怎么连接电脑主机

要将LED显示屏连接到计算机主机&#xff0c;通常需要使用适当的接口和连接线。以下是常见的连接方法&#xff1a; HDMI接口&#xff1a;大多数现代计算机和LED显示屏都配备了HDMI接口。您可以使用HDMI连接线将计算机主机的HDMI输出端口连接到LED显示屏的HDMI输入端口。这种连接…

leetcode--环形链表.找到入环节点(java)

环形链表II 环形链表.找到入环节点题目描述解题思路 环形链表.找到入环节点 LeetCode 142&#xff1a;环形链表II 可以在这里测试 题目描述 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节…

深度解析线程的正确停止方法

一、解惑 1. 什么情况下&#xff0c;线程需要被停止&#xff1f; 线程和任务被创建和启动之后&#xff0c;大部分情况下都是自然运行到结束的&#xff0c;自然停止&#xff0c;但有些情况会需要用到停止线程&#xff0c;如&#xff1a; 用户主动取消 服务被快速关闭 运行出…