首页 > 解决方案 > Puppeteer:将返回结果与文本文件进行比较

问题描述

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

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;

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

我认为可以做到的方法之一是:

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

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

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

但是,如果消息数据是唯一的,它将像往常一样返回数据:

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

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

所以基本上,在终端中返回(记录)数据之前,使用 .txt 文件进行比较。

我的问题是:这个过程甚至可能吗?

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

我不是编码员,我希望我说清楚了。

谢谢。

标签: javascriptnode.jspuppeteer

解决方案


我建议你使用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;

推荐阅读