javascript - 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 文件进行比较。
我的问题是:这个过程甚至可能吗?
如果是,任何线索或帮助将不胜感激。
我不是编码员,我希望我说清楚了。
谢谢。
解决方案
我建议你使用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;
推荐阅读
- python - Lda Mallet 返回非零退出状态 1
- azure-sql-database - 从数据湖中读取元数据 CSV,对于查找活动来说太大了
- python - 如何在绘图中添加多个带有循环的形状
- linux - Weasyprint 输出格式问题 - 如何使用 CSS @page?
- windows - 使用 userdata 在 EC2 实例设置中为所有用户访问 Windows FileShare
- pdf - 理论上从.pdf文件中提取文本
- python - 如何最小化chromedriver的资源使用?
- swift - 在 URLRequest 中使用 Combine 将对象编码为 httpBody
- django - django-allauth 将社交登录限制为注册用户
- java - 使用 Jython 打开特定浏览器