You need to enable JavaScript to run this app. Puppeteer定时抓取网页数据时如何实现消息去重:重复返回空、新消息正常输出
优惠活动
大模型
产品
解决方案
定价
更多

Puppeteer定时抓取网页数据时如何实现消息去重:重复返回空、新消息正常输出

轻量化实现方案(无需额外文件、无第三方依赖)

你原本设想的两种方案都可以再简化到极致——完全不需要搞三个文本文件来回读写,也不用只对比上一次的结果,利用Node.js模块本身的作用域特性就能实现零额外开销的去重逻辑。

核心逻辑说明

你的抓取函数是被同一个调度进程循环调用的,我们只需要在模块加载阶段,在内存里初始化一个用来存「所有已经出现过的历史消息」的集合,每次执行抓取流程时做一次比对即可:

  • 如果当前抓的消息不在历史集合里:说明是首次出现的新消息,把它加入历史集合,正常输出消息内容
  • 如果当前抓的消息已经在历史集合里:说明是重复内容,直接把输出的message字段置空

这个方案比单对比上一次结果更可靠:不会出现「消息A→消息B→消息A」这类循环重复时,把第二次出现的A误判为新消息的问题。

修改后的完整代码

// 模块首次加载时初始化,整个进程生命周期内只会执行一次
// 存储所有已经见过的历史消息,存在进程内存中,无磁盘IO开销
const seenUniqueMessages = new Set();

module.exports = async function grabResult(page) {
  const message = await page.$eval(
    'div > div:nth-child(2)',
    (el) => el.innerText.trim() // 顺手清除首尾多余空格,避免格式差异导致的重复误判
  );

  const username = await page.$eval(
    'child(15) .username',
    (el) => el.innerText
  );

  // 去重判断逻辑
  let outputMessage = message;
  if (seenUniqueMessages.has(message)) {
    outputMessage = ''; // 重复消息置空
  } else {
    seenUniqueMessages.add(message); // 新消息存入历史集合
  }

  return { message: outputMessage, username };
};

特殊场景补充

如果你的调度逻辑是每次抓取完成后就重启Node.js进程,内存里的集合会在进程重启时清空,这时候也完全不需要搞三个txt文件:

  • 只需要一个单独的seen_messages.json文件存历史消息即可
  • 进程启动时先读取这个json文件的内容,加载到内存的集合里
  • 每次抓到新消息时,把集合内容整体写回json文件就行,全程单文件,没有冗余的读写逻辑

另外不需要依赖Puppeteer本身做对比逻辑:Puppeteer的职责只是从页面提取原始内容,去重属于本地业务处理环节,在拿到提取结果后本地判断即可,不需要让浏览器端做多余操作。

内容的提问来源于stack exchange,提问作者robert0

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.22 10:36:03