#javascript #for-loop #puppeteer #infinite-loop #puppeteer-cluster
#javascript #для цикла #кукловод #бесконечный цикл #кукловод-кластер
Вопрос:
Я очень новичок в puppeteer-cluster. Моя цель — бесконечно очищать список из 100 сайтов, поэтому, как только я дойду до 100-й ссылки, скрипт запустится снова (в идеале, повторно используя тот же экземпляр кластера). Есть ли лучший способ или правильный способ сделать это? Я подумал, что было бы проще просто создать бесконечный цикл (и вращать элементы) специально. Любые советы будут оценены.
Вот мой код:
(async () => {
const cluster = await Cluster.launch({
concurrency: Cluster.CONCURRENCY_CONTEXT,
maxConcurrency: 20,
monitor: true
});
// Extracts document.title of the crawled pages
await cluster.task(async ({ page, data: url }) => {
await page.goto(url, { waitUntil: 'domcontentloaded' });
const pageTitle = await page.evaluate(() => document.title);
console.log(pageTitle);
});
// In case of problems, log them
cluster.on('taskerror', (err, data) => {
console.log(` Error crawling ${data}: ${err.message}`);
});
while (true) {
await new Promise(resolve => setTimeout(crawl, 5000));
}
async function crawl() {
for (let i = 0; i < sites.length; i ) {
const site = sites[i];
site["product_urls"].forEach(async (url) => {
await cluster.execute(url);
});
}
await cluster.idle();
}
})();
Комментарии:
1. Я думаю, что это лучше подходит для обмена стеком проверки кода .
2. При этом, просто проверьте, равен ли i сайтам. длина — 1 и запустить
crawl()
снова?, нет необходимости запускать setTimeout?
Ответ №1:
for (;;) {}
Даст вам бесконечный цикл без каких-либо проблем, связанных с такими вещами, как ESLint, или предупреждениями о «недоступном коде».
Тем не менее, возможно, не помешает установить резервное условие, чтобы ваш код мог безопасно завершиться, если это необходимо