繁体   English   中英

如何让 node.js 网络爬虫定期检查数据更新的端点?

[英]How to make a node.js webscraper periodically check an endpoint for data updates?

我正在编写一个不和谐的机器人,它聚合来自第三方 API 的数据。

我想为我的网络抓取功能遵循discord.js一种设计模式,其中实例化一个客户端对象,并在客户端发出特定事件时执行操作,如下所示:

const Discord = require('discord.js');
const client = new Discord.Client();

client.on('ready', () => {
  console.log(`Logged in as ${client.user.tag}!`);
});

client.on('message', msg => {
  if (msg.content === 'ping') {
    msg.reply('Pong!');
  }
});

client.login('token');

据我了解,这段代码将无限期运行,每次发出特定事件时执行操作,例如readymessage

我不知道如何实现这样的功能。 更具体地说,我无法弄清楚 discord client对象如何不断地寻找变化,并在注意到它们时发出一个事件。

我想模仿这种设计模式的原因是,我可以运行一个 node.js 应用程序,该应用程序将每隔 10 分钟访问 API 并查看是否有新信息,并在有新信息时将其登录到数据库中变化。

我最初的想法是这样的,但它会因内存不足错误而炸毁调用堆栈。

const events = require("events");

class ScrapeEmitter extends events.EventEmitter {}
const scrapeEmitter = new ScrapeEmitter();

scrapeEmitter.on("timeExpired", () => console.log("call scraping code here"));

while (true) {
  setTimeout(() => scrapeEmitter.emit("timeExpired"), 1500);
}

最终目标是从index.js编写以下内容,并让它既侦听不和谐事件,同时也抓取数据。

import * as scraper from "./core/scraper";
const Discord = require('discord.js');
const client = new Discord.Client();

client.on('ready', () => {
  console.log(`Logged in as ${client.user.tag}!`);
});

client.on('message', msg => {
  if (msg.content === 'ping') {
    msg.reply('Pong!');
  }
});

client.login('token');
scraper.begin_scraping();

这部分代码

while (true) {
  setTimeout(() => scrapeEmitter.emit("timeExpired"), 1500);
}

创建无限数量的超时。 您需要做的只是在前一个完成后开始超时 一个例子是:

function loop() {
setTimeout(loop, 1500);
}

这将在 1500 秒后调用该函数,然后在 1500 秒后调用该函数,依此类推。

但是,更好的解决方案是使用setInterval() 它看起来像这样:

function loop() {};
setInterval(loop, 1500);

所以,而不是写

while (true) {
  setTimeout(() => scrapeEmitter.emit("timeExpired"), 1500);
}

setInterval(() => scrapeEmitter.emit("timeExpired"), 1500);

这将消除无限循环并按预期运行。

我只是将@Worthy Alpaca 的回答翻译成评论。 这是一个社区维基,所以我没有声誉

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM