前言
在小红书和公众号上,连续发表了几篇关于 Automa 的笔记,许多朋友从后台,加我的微信好友,表达了对 automa 的喜欢。
Automa 这个开源项目,发布有两年多,历经多次特性更新,更好用了。
RPA
说到自动化,很多朋友提到 RPA。但我还没有深入地用过,一款 RPA 软件。印象里,是桌面端,各个应用,进程捕捉、窗体捕捉、按钮点击、应用唤醒,等等。
如果那些是 RPA 的话,那么 Automa 就完全不是 RPA。
Automa 是浏览器插件,所有的操作,都基于浏览器 API。所以,Automa 无法拉起桌面窗口,比如记事本、便笺。TA 无法操作,除了浏览器之外,任何的应用。
RPA 可以被称为第三方辅助,而 Automa 则是单纯的浏览器操作。
小红书笔记
我在社区看到,有博主用 RPA 软件,小红书后台数据,提取页面的笔记数据。但在浏览器内,用 automa 操作,不是更原汁原味么。所以,写了这个插件工具。
1,页面分析
首先登录小红书后台,下面这个是笔记管理页面的链接:
https://creator.xiaohongshu.com/creator/notes
右边部分,顶部是曲线图,账号的总体统计。下方就是全部的笔记列表。带的有分页,不同账号,笔记数量不同,页码也不同。这里要重点处理。
2,Automa实现
下面,我们使用 Automa 实现提取流程,同时作为 Automa 的学习入门教程。
2.1 新窗口打开
为了与其他浏览器窗口区别,使用”新建窗口“模块。
然后,打开一个新tab页,地址填入上面的笔记列表。
2.2 分页元素存在
这个页面,底部有分页结构。为了翻页,确保分页元素存在。使用 “元素存在”模块,保证页面加载完成。
使用CSS选择器,确定元素,分析页面得到,分页数据的父级元素,类名是 “page-settings”。
2.3 总页数
循环的方式有很多,页面分页条,是动态变化的。有的账号,可能发表了上百页笔记。识别页码,不太稳定。经过测试,默认每页 12 个笔记,使用总页数进行循环。
不巧的是,页面返回的是 共 173 条,15 页
,这样的数据。我们仅需要 15 这个数据。使用现有模块,比如:“属性值”,“获取文本”,拿到的都是这个内容。所以需要提取。
使用 JavaScript 模块,使用 JavaScript 获取元素,文本,提取值。
需要大家有 JavaScript 的基础,语法,数据类型,DOM 知识。下面是获取元素的文本内容:
const itm = document.querySelector(".page-settings");
const content = itm.innerText.replaceAll(" ", "").replaceAll("n", "");
console.log("pure content", content);
文本内,除了有 2 个数字,其他的内容,都不需要。写一个助手函数:
function extractNumbers(input) {
const pattern = /共(d+)条,(d+)页/;
if (!pattern.test(input)) {
throw new Error('Input string does not match the expected format');
}
const matches = input.match(pattern);
return {
totalNum: parseInt(matches[1], 10),
totalPage: parseInt(matches[2], 10)
};
}
使用了正则表达式,d+
提取数字。拿到数字之后,要提供给 Automa 其他的块使用。使用内置的 automaSetVariable
方法,创建新变量,给变量赋值。
automaSetVariable('totalNum', totalNum);
automaSetVariable('totalPage', totalPage);
2.4 准备表格 Table
打开新标签后,是第一页数据。我们先把这一页数据,提取出来。多个循环,可以使用变量存储,但不太直观,只能在日志内查看。
既然最终要导出表格,索性就建一个表格,先把流程内的数据,存储到表格。最后一下子导出。
上面的表格字段,名字可以随便起。在流程里,哪个值,存到表格的哪个字段,对应好就行。
2.5 获取页面
F12,在 Elements 里,用鼠标挨个选中,分析页面内的元素。
上图圈出来的,就是笔记的列表。有特定的css类名,使用这个筛选就好了。但是,每一个笔记卡片,有标题,有发布时间,有点赞、收藏、涨粉量。每个都是不同的元素。
在大循环里,挨个遍历笔记卡片;每个小卡片,提取内容。而赞藏量,元素是这样的。
分成了两个 ul 无序列表,每个列表里,有多个 li 元素。用现有模块,实现起来,没那么灵活。所以,还是用 JavaScript 块实现。
使用 JavaScript 提取 DOM 内的元素,并格式化为 []Object
。这个数组,就是每页的原始数据。格式如下:
[
{
"title":"笔记标题",
"pubAt":"2024-01-02",
"views":2328,
"thumbs":50,
"favs":42,
"comments":12,
"shares":9,
"fans":21
}
]
在块内,把这个数组,使用 automaSetVariable
,赋值给新的变量。下一节,存表要用到。
2.6 存表
把提取好的页面数据,存到表格 Table 内。要用到 “循环数据“、“插入数据”、“循环断点”三个模块。
把上一个块得到的 currentRows
变量里的数组,依次循环:
循环需要添加”循环断点“,不然,只会循环一次,就通过了。这一点,用的时候,一定要注意。
循环内,获取每次循环的元素的值,使用全局变量 loopData
获取。
对于上述的 JSON 数据,每个元素,是一个对象。有 title、pubAt 等属性。那么,在循环体内,获取其值,就是上图格式。
2.7 下一页
上面的步骤,已经完成了一个页面的流程。数据拿到了,也存表格了。下面的,无非是对之前流程的重复。
页面之间,要有个随机延迟。Automa 生成随机整数,有个小技巧。这个表达式,是内置支持的,但文档里没有。
点击下一页,加载下一页内容。使用“点击元素”模块。下一页按钮,是动态变化的。使用 CSS 选择器,无法在切换下一页的时候,始终选中。所以,要使用功能更强的 XPath 方式。
2.8 循环 – 导出Excel
在 2.3 节,确定了总页数 totalPage
,减去第一页,一共需要循环 totalPage -1
次,就完成了。
使用 “重复任务”模块,设置循环的次数为 totalPage - 2
次。这里,有一个小提示。“重复任务”模块,是先循环,再判断。
循环任务结束后,所有页面完成。使用“导出数据”模块,把当前流程内,表格的数据,导出为 CSV(逗号分隔符,用 Excel 直接打开)。
知识点总结
上述工作流的搭建,用到了许多 Automa 的特性。要学会灵活掌握,才能熟练地搭建。这里有一些小提示,要反复练习。
-
• 元素存在:页面加载完成,等待元素;
-
• 循环任务:跟 C 语言里
{} loop(condition)
类似,先循环,再判断; -
• 随机整数:使用纯 JavaScript 实现,至少要
Math.floor(Math.random() * diff + min)
才能实现;Automa 内置了$randint
方式,直接用就好了; -
• 获取元素:简单页面,一个元素,一个值,够用了;复杂页面,只能用 DOM 提取,所以要写 JavaScript 代码;
-
• 循环变量:Automa 循环体内,使用内置变量
loopData.loopId
的方式,拿到循环数据;循环的数据类型,与 JavaScript 一致。
写在最后
如果你在运营小红书,需要不时复盘爆款笔记。但小红书手机端、网页后台,提供的功能,无法导出数据,很难分析。这个工具,正好帮到你。
点击下方二维码,添加小编微信好友,备注“小红书报表”,您将立即收到完整流程插件资料包。