Puppeteer:将 return 结果与文本文件进行比较

Puppeteer: compare return result with a text file

所以我有这段代码,现在正在抓取网络,return结果(消息和用户名):

function containsWords(words, message) {
    return words.some(w => message.includes(w));
}

async function grabResult(page) {
    const message = await page.$eval(
        'div > div:nth-child(2)',
        (el) => el.innerText
    );
    
    const username = await page.$eval(
        'child(15) .username',
        (el) => el.innerText
    );

    return {
        message: containsWords(['http', 'https'], message) ? '' : message,
        username: username
    };
};


module.exports = grabResult;

由于上面的代码正在抓取一个动态变化的网站,我想要实现的是避免 return 重复消息。

我认为可行的方法之一是:

正在创建一个 .txt 文件,其中将存储先前的结果。

因此,只要在 return 之前检索到新数据,它就会将新的 'message' 结果与 .txt 'message' 结果进行比较,如果是相同的数据,它会 return 一条空消息:

{ message: '', username: 'John' }

但是,如果消息数据是唯一的,它会 return 正常情况下的数据:

{ message: 'message text', username: 'John' }

并用该数据更新 .txt 文件(以便下次再次与新数据进行比较)。

基本上,在 return 在终端中输入(记录)数据之前,使用 .txt 文件进行比较。

我的问题是:这个过程是否可行?

如果是,任何线索或帮助将不胜感激。

我不是程序员,希望我说清楚了。

谢谢。

我建议您使用 JSON 而不是纯文本 — 这将使所有检查更容易。

  1. 在放置脚本的同一文件夹中创建一个文件 data.json。该文件必须仅包含两个大括号:[]。它将为初学者指定一个空对象。

  2. 您的脚本将使用 fs 模块读取文件,并从中生成一个 JS 数组。然后它将检查数组是否有当前消息。如果是这样,消息将被转换为空字符串。如果不是,则更新数组并重写文件。

这是一个脚本示例:

const { readFileSync, writeFileSync } = require('fs');

function containsWords(words, message) {
    return words.some(w => message.includes(w));
}

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

    let message = await page.$eval(
        'div > div:nth-child(2)',
        (el) => el.innerText
    );

    if(containsWords(['http', 'https'], message)) message = '';

    const dataArray = JSON.parse(readFileSync('./data.json', 'utf8'));

    if (dataArray.includes(message)) {
      message = '';
    } else {
      dataArray.push(message);
      writeFileSync('./data.json', JSON.stringify(dataArray));
    }

    return { message, username };
};

module.exports = grabResult;