晓晓的个人博客Logo
晓晓的个人博客
源网站数据采集方案之解析DOM(五)
AI提炼icon
提炼
本文介绍基于 “chrome.scripting + cheerio” 的源网站数据采集方案,核心流程为:Service Worker 打开 TAB 页,通过 chrome.scripting 获取 DOM 字符串,利用 cheerio 库解析数据并抛给服务端。相较于上一方案,该方案优势显著:交互更少,因无并发问题,插件端可存储数据,服务端非必需;同步执行,流程易理解、编码量少,对开发者友好;只需关注 DOM 节点出现时机,异常逻辑减少;执行时间相近但更易调试,减少了等待场景。文中还展示了插入按钮、Service Worker 同步处理的代码实现。最后强调前端工程师设计技术方案时,需注重完整性与用户交互体验,后续将持续更新新方案。
本文于 2025-06-27 09:01 首次发布,最后修改于 2025-08-27 13:05

写在开篇

看过上一节的朋友是不是很期待这一小节?嘿嘿,那现在就开讲吧。

首先,我们来认识一下 cheerio 库。

cheerio 库是一个基于 Node.js 的轻量级 HTML/XML 解析工具,专门用于在服务端高效处理网页内容,其设计灵感来源于前端 JavaScript 的 jQuery 库,语法和操作方式高度相似,因此学习成本极低。

上面是豆包关于 cheerio 库的介绍,简单来说,cheerio 库就是可以像 jquery 一样操作 html 中的 dom 节点的一个 JS 库,两者区别就是 cheerio 可以将 html 字符串转换成 dom 节点实例后再进行操作,jquery 库是直接操作 DOM 节点。

技术方案设计

知道了 cheerio 库的作用后,“chrome.scripting + cheerio”这个方案的流程理解起来就真的很容易了。

浏览器插件使用scripting函数解析DOM数据
浏览器插件使用scripting函数解析DOM数据

结合上图,流程说明如下:

  1. Service Worker 打开 TAB;

  2. 由 Service Worker 使用 chrome.scripting 函数获取新 TAB 页 body 下的所有 DOM 节点的字符串;

  3. 利用 cheerio 进行 DOM 节点的解析获取到数据;

  4. 将数据抛给第三方存储系统或向发起请求的 TAB 页抛出反馈信息。

    1. 数据的抛出可以单个单个向存储系统/请求侧抛出,也可以整体抛出,在这个方案中不会有多大影响(我们这里使用单个单个抛给服务端的方式,减少各个采集过程的相互影响)

特别需要提醒的是,在这个方案中,新打开的TAB页不过就是展示出数据等待 Service Worker 去取而已,并不会涉及到新开 TAB 页中的浏览器 API 的调用。

另外,最重要的一点是,由以上流程图可以清晰的看出 单个链接的采集流程是同步执行的、两个链接采集之间也是同步执行的,所以,无论是流程理解上还是代码编写上,对于技术人员来说简直就是顺手拧开瓶般轻松;

方案落地与Demo

讲完理论的东西,我们当然要落到代码上啦~

首先,还是在发起的TAB页中插入可执行按钮。

接着就是Service Worker的事情了,很简单的同步代码。

以上代码实践后,就会有这样的效果:

与上一节方案对比

看到这里,你是不是也意识到:当数据存在于用户可视页面上时,本文阐述的方案更便捷呢?那接下来,我们就好好整理下两个方案到底有哪些区别吧!

1. 首当其冲的当然是最大的优势:在足够满足技术方案完整性的情况下,涉及的技术端之间的交互更少;

这里说的是,虽然方案设计时我们加入了服务端的内容,但事实上,因为本次方案不像上一小节的方案具有并发问题,也就是插件端存储数据的能力就完全可用了,即,服务端的存储可要可不要;

另一方面就是,虽然本小节的方案依然涉及到了TAB页的操控,但新TAB页中不会涉及到消息通信、浏览器API的调用,相当于出现异常逻辑的可能性更少了;

2. 第二个就是本文方案是同步执行,在开发方面对技术人员的比较友好(不仅流程理解性高,而且编码量具少);

3. 兜底策略上,本方案只需注意 DOM 节点的出现时机即可;

4. 但从执行时间上来讲,其实两个方案的执行时间是差不多的,只不过本方案更方便去调试、缩短执行时间。

上一节的方案中有几个必要的停留时间:链接与链接之间的间隔时间、Service Worker 等待 Content 层准备好的时间、Content 层需要等待数据出现的时间、为避免消息丢失而需要等待的时间、最后判断是否全部链接采集完毕的等待时间;

本方案的必要停留时间就很少了:链接与链接之间的间隔时间、Content 层需要等待数据出现的时间;

相比较之下,越少的等待场景,调试起来肯定越简单;

写在最后

到此,应对源网站风控的几个方案就讲完了,后续如果有其他方案的,会继续更新,望各位朋友持续关注哈~

与君共勉

作为前端工程师,在构思技术方案时,需以全局视野构建兼具完整性与前瞻性的体系,确保方案各环节逻辑自洽、无遗漏死角。同时,需将用户交互体验置于核心位置,从操作流畅度、视觉反馈到场景适配性等维度精细打磨,让技术方案不仅实现功能目标,更能为用户带来自然、愉悦且高效的使用感受。

0个赞
喜欢就点个赞吧