利用 n8n 低代码实现简单爬虫
date
Dec 27, 2022
slug
利用 n8n 低代码实现简单爬虫
status
Published
tags
Fool Around
NAS
summary
实现一个小型爬虫,监控 Hostloc 的帖子,如果提到了诸如“甲骨文”,“ARM”等等关键词,就通过 Telegram 推送给我。这样的话,我错过下一次开放抢购的机会就很小了。
type
Post
背景
众所周知,甲骨文的免费 VPS 非常良心,我常年用它们当作备用的翻墙通道,也部属了一些小型服务在上面。在推出了免费的 ARM 机型之后,就显得更香了。但是因为太过于良心,导致免费的 ARM 机型也很不容易抢到,每次我看到消息的时候,都已经抢光了。
目标
实现一个小型爬虫,监控 Hostloc 的帖子,如果提到了诸如“甲骨文”,“ARM”等等关键词,就通过 Telegram 推送给我。这样的话,我错过下一次开放抢购的机会就很小了。
实现
因为需求其实很简单,单独写一个爬虫显得有点兴师动众了。正好我最近接触了 n8n,就尝试一下使用 n8n 来实现这个需求。
首先是信息源,RSShub 有现成的 Hostloc 的路由可以用,所以我需要 n8n 有读 RSS feed 的能力,这点满足。
其次是发消息通知我的能力,Telegram 的机器人很简单,拿到 token 之后简单的调用 API 就可以发消息。这个也不用自己实现,n8n 也有 Telegram 相关的 node。
再次就剩下爬虫的逻辑了,RSS 的输出是这样的。
显然,我们关心的信息在 item.title 和 item.description 中,n8n 的 RSS node 会把读到的内容转成 JSON 输出。输出之后是下面这个样子。
不过我没找到简单的自定义过滤逻辑的 node,不过 n8n 也支持自定义的 code,所以我们可以自己写简单的过滤逻辑。code node 长下面这样。
过滤之后转给 Telegram node 就可以了。
但是实际跑了之后,发现一个坑,就是去重。每次都是抓最新的几条内容,如果赶上晚上没人发帖,而且最新的几个帖子中正好有匹配的。那每跑一次,我就会收到一条消息。这肯定是没法接受的。所以还需要一个去重机制。
经过尝试,我最终选择创建和读取本地文件的方式来实现,n8n 也支持读取常见的数据库,但我觉得对于这个需求来说有点过于麻烦了。
最终的实现就是这个样子,在得到 RSS 信息之后,通过 code node 加上当前的时间,然后过滤得到一个最新的 list1。读临时文件,里面是记录的发过消息的 list2。
用 n8n 的 compare node,这个 node 会输出 4 个分支数据,分别是 In A only、Same、Different、In B only。显然 In A only 是新抓到的感兴趣的消息,same 是重复的,In B only 是已经发过的消息。经过合并和过滤之后,就实现了这个简单的爬虫。
我本来以为开始跑之后要很长时间才有收获,没想到只跑了不到一周就成功让我抢到了免费的 ARM 机器。4C24G 的配置确实很香。