Я выполняю веб-сканер с puppeteer !.
Цикл передает функции (loadPage (URL)) действительный URL-адрес, но хотел бы приостановить циклкогда N страниц обрабатывается сканированием.
Я думал о том, чтобы сделать тайм-аут со средним временем, которое ученик тратит на бег.Но я не думаю, что это решение.Но я открыт для любой дискуссии.
Спасибо.
--- Редактирование для дальнейшего использования ---
const puppeteer = require('puppeteer');
const stores = require('./data.json').stores;
const MAX_CONCURRENT_TASKS = 5;
let TOTAL_PAGES = 0;
const start = async () => {
//@TODO Create a separate log routine
console.log('Total de Lojas', stores.length)
let actualStore = null;
let activatedStores = [];
for (const store of stores) {
if (store.active) {
activatedStores.push(store)
}
}
//@TODO Create a separate log routine
console.log('Lojas ativas', activatedStores.length)
try {
const browser = await puppeteer.launch({
headless: false //Debug porpouse
});
const pagePool = await Promise.all(Array.from(
new Array(MAX_CONCURRENT_TASKS),
() => browser.newPage()
))
while (activatedStores.length !== 0) {
//@TODO Create a separate log routine
console.log(`Stores left: ${activatedStores.length - MAX_CONCURRENT_TASKS}!`)
await Promise.all(
activatedStores.splice(0, MAX_CONCURRENT_TASKS)
.map((store, i) => loadPage(store.siteMap,
pagePool[i], store))
)
}
await browser.close();
} catch (error) {
//@TODO create function to generate error logs
console.error(error)
}
}
/**
*Function to load pages
*
* @param {string} url - a valid url
* @param {puppeter} page - puppeteer browser.newPage()
* @param {Object} store - the settings of this store
*/
const loadPage = async (url, page, store) => {
const opts = {
timeout: 0,
waitUntil: 'domcontentloaded'
}
page.setUserAgent('Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36')
await page.goto(url, opts);
//@TODO Create a separate log routine
console.log(await page.evaluate(() => document.location.href));
}
start()