node-request-queue
создается для пакета request
, который отличается от express
.
Вы можете выполнить очередь, используя простейшую библиотеку очередей обещаний p-очередь .Он поддерживает параллелизм и выглядит намного более читабельным, чем любые другие библиотеки.Вы можете легко переключаться с обещаний в более надежную очередь, например bull
, в более позднее время.
. Таким образом вы можете создать очередь,
const PQueue = require("p-queue");
const queue = new PQueue({ concurrency: 1 });
.асинхронная функция в очереди, она будет возвращать разрешенные данные, если вы ее слушаете,
queue.add(() => scrape(url));
Поэтому вместо добавления маршрута в очередь вы просто удаляете другие линии вокруг нее и сохраняете маршрутизатор как есть.
// here goes one route
app.use('/wa', router);
Внутри одного из файлов вашего маршрутизатора,
const routes = require("express").Router();
const PQueue = require("p-queue");
// create a new queue, and pass how many you want to scrape at once
const queue = new PQueue({ concurrency: 1 });
// our scraper function lives outside route to keep things clean
// the dummy function returns the title of provided url
const scrape = require('../scraper');
async function queueScraper(url) {
return queue.add(() => scrape(url));
}
routes.post("/", async (req, res) => {
const result = await queueScraper(req.body.url);
res.status(200).json(result);
});
module.exports = routes;
Убедитесь, что очередь включена в маршрут, а не наоборот.Создайте только одну очередь в файле routes
или там, где вы запускаете скребок.
Вот содержимое файла скребка, вы можете использовать любой контент, который вам нужен, это просто рабочий манекен,
const puppeteer = require('puppeteer');
// a dummy scraper function
// launches a browser and gets title
async function scrape(url){
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto(url);
const title = await page.title();
await browser.close();
return title
}
module.exports = scrape;
Результат с использованием curl:
Вот моего репозитория git , в котором есть рабочий код с образцом очереди.
Предупреждение
Если вы используете какую-либо из таких очередей, вы заметите, что у вас возникли проблемы с одновременным обработкой 100 результатов, и запрос к вашему API будет отсрочен из-за истечения времени ожидания 99 других URLв очереди.Вот почему вы должны узнать больше о реальной очереди и параллелизме позже.
Как только вы поймете, как работает очередь, вам помогут другие ответы о cluster-puppeteer, rabbitMQ, bull queue и т. Д.время :).