前端不止 CRUD,还能当 Spider Man

前端不止 CRUD,还能当 Spider Man

基于 Electron + Puppeteer + ChromeExtension 的低代码可视化网络爬虫, 相比 rpa 软件,更了解 DOM。

本文先介绍以上三个工具是什么,以及将这三个工具结合起来能捣鼓出一个什么东西。

获取Spider Man

下载地址: github.com/qianqianhai...

项目仓库:github.com/qianqianhai...

使用文档 请查看: sunsilent.gitee.io/junk-puppet...

三个工具

首先介绍三个工具: Electron + Puppeteer + ChromeExtension

Electron

可以先理解给一个包含了 ChromiumNode.js环境 的可以在操作系统中直接运行的可执行文件

Puppeteer

可以理解为一个封装了非常非常多 CDP 命令的库。 CDP 是什么,Chrome DevTools Protocol。 可直接与 Chromium 内核通信

ChromeExtension

谷歌插件开发。这里主要使用了 content_scripts, 可以在指定页面打开的某个时间段注入指定脚本

介绍完了?是的,目前大家只需要知道这三个工具主要是干什么的就行了。目前前端圈的工具实在是太多了,没必要都深入理解。思考将哪些工具结合起来会碰撞出 love 的火花,大家有了想法之后,再深入了解 验证可行性即可。

SpiderMan 概念

我们将捣鼓出来的东西暂且先叫做 猪猪侠 吧, 我将 猪猪侠 项目划分为了 三个角色

  1. 管理者(Electron),负责统筹调度
  2. 收集者(content_scripts),负责收集必要信息
  3. 执行者(Puppeteer),负责执行操作

管理者

我们这些 js 工具的使用必要要依赖 Node 环境,所以 Electron 作为一个内置了 Chromium 和 Ndoejs 的工具理所应当的成为了管理者。

整个 Electron 应用的坐落在操作系统层面的,Electron 又分为两个进程,一个是渲染进程(可以暂理解为前端),一个是主进程(可以暂理解为后端)

管理者的作用的给与使用者一个 UI 可交互页面,并且负有数据记录、管理子进程的运行和通信的任务

收集者

这个是收集过程图

我们在 Electron 应用中通过 主进程 启动一个 子进程(child_process) 运行 Puppeteer

Puppeteer 是一个封装了非常多 CDP 命令的库,我们通过 Puppeteer 打开浏览器,并且加载了一个 ChromeExtension

这个插件向我们打开的目标页面中注入了一段 javascript 代码(content_scripts)。

下面的重点就是,注入的这一段 javascript 代码运行了什么,它的的作用是什么?

既然将这一流程称之为收集者,肯定是收集数据了。

首先是收集用户无感知操作内容,包括鼠标事件、滚动事件和键盘事件。

之所以要记录用户无感知操作内容一方面是对抗反爬,有些网站会通过鼠标手势等对爬虫进行检测,其次是更加真实的还原用户操作过程

其次是收集用户执行的内置函数功能,比如我们之内好的提取文本、提取元素截图、提取网页截图和延迟等

之后将收集好的数据反馈给管理者,由管理者进行归档整理。

至此,收集者的任务结束(当然这只是一个简单的收集者模型,收集者还需要兼顾页面导航,及时反馈等内容)

执行者

执行者的任务就简单了,通过 Puppeteer 发送 CDP 命令给 Chromium 内核执行对应的操作

然后 Puppeteer 将执行的结果反馈给主进程进程进行记录

根据每个操作的类型执行对应的操作,并记录结果

项目详解

Electron应用入口及通信

首先,Electron应用程序至少存在着两个进程,一个是主进程一个是渲染进程。

渲染进程提供了一个我们可以交互的界面,而我们所有的交互最终都会反馈给主进程。

那么,我们就需要先建立两个进程间的通信 代码位置

通过 Electron官方资料 了解进程间通信

在建立了主渲进程通信之后,我们就可以通过 渲染进程提供的UI界面中的一个按钮 去调用 主进程中的函数

通过 Puppeteer 去打开浏览器并注入content_scripts

我们通过在Electron中通过Puppeteer去操作浏览器,原理很简单,Puppeteer作为一个封装了极其丰富CDP命令的库,通过简单的函数调用即可实现与Chromium内核的通信 代码位置

我们通过Puppeteer打开浏览器时可以传递一个自动加载一个ChromeExntesion的参数。代码位置

当指定页面打开时,这个ChromeExtension自动将我们的内容脚本(content_scirpts)加载在页面中,这个内容脚本就是我们的收集者

收集者是单独开发的ChromeExtension是为了避免过度的依赖Puppeteer,方便后续集成在非Node环境 代码位置

收集者主要负责监听全局事件(代码位置)和内置函数功能(代码位置1 代码位置2

在收集者收集完数据之后会将收集结果反馈给Puppeteer

content_scripts 和 Puppeteer之间的通信是通过 postMessage 实现的 Puppeteer收 content_scripts发

通过 Puppeteer 还原用户操作

在我们拿到收集者收集到的用户操作数据之后,接下来就是还原用户操作

我们通过Electron中 Puppeteer 将收集到的用户操作信息转换为CDP命令发送给Chromium内核,让Chromium内核执行相应的操作

在这个过程中,我们需要做到的是在后台运行(headless模式),不用在界面上打开浏览器。尽量做到不影响用户的正常使用,也就是无感知运行,但是Headless模式也就意味着有更大的可能被反爬虫机制所判定。

幸运的是 Chrome 112 现已推出全新的Headless模式! ,在新Headless的加持下,我们可以在后台运行的时候得到与正常浏览一样的体验,这就使得反爬机制的判定更加困难

在新Headless模式的加持下,再加上一点点的欺骗手段。所有 fpscanner 测试现在都是绿色的、所有 intoli 测试和 areyouheadless 测试都是绿色的

成品展示

掘金自动签到

开启定时任务,爬取新浪热搜,自动执行

截取新浪热搜每一条的元素

JSON 数据格式,每一步均可配置

非常方便的嵌入式工具箱,满足你的大部分需求

选取元素高亮显示,简单易懂

各位大佬如果有好的想法或建议,欢迎探讨!

相关推荐
数据小小爬虫2 小时前
爬虫代码的适应性:如何调整以匹配速卖通新商品页面
爬虫
数据小爬虫@15 小时前
如何利用PHP爬虫获取速卖通(AliExpress)商品评论
开发语言·爬虫·php
susu108301891115 小时前
python实现根据搜索关键词爬取某宝商品信息
爬虫·python
hans77488296818 小时前
Python入门项目:一个简单的办公自动化需求
前端·爬虫·数据分析
帅逼码农18 小时前
python爬虫代码
开发语言·爬虫·python·安全架构
数据小小爬虫1 天前
Python爬虫获取AliExpress商品详情
开发语言·爬虫·python
小爬虫程序猿1 天前
利用Python爬虫速卖通按关键字搜索AliExpress商品
开发语言·爬虫·python
小爬虫程序猿1 天前
利用Java爬虫获取速卖通(AliExpress)商品详情的详细指南
java·开发语言·爬虫
小爬虫程序猿1 天前
利用Java爬虫速卖通按关键字搜索AliExpress商品
java·开发语言·爬虫
API快乐传递者1 天前
Python爬虫获取淘宝详情接口详细解析
开发语言·爬虫·python