簡體   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