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 而不是纯文本 — 这将使所有检查更容易。
在放置脚本的同一文件夹中创建一个文件 data.json
。该文件必须仅包含两个大括号:[]
。它将为初学者指定一个空对象。
您的脚本将使用 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;
所以我有这段代码,现在正在抓取网络,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 而不是纯文本 — 这将使所有检查更容易。
在放置脚本的同一文件夹中创建一个文件
data.json
。该文件必须仅包含两个大括号:[]
。它将为初学者指定一个空对象。您的脚本将使用
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;