如何让puppeteer跟随新页面实例中的多个链接,以并发和异步方式评估它们?
解决方法:
几乎每个Puppeteer方法都返回一个Promise.所以你可以使用例如https://www.npmjs.com/package/es6-promise-pool包.
首先,您需要创建一个处理一个url的异步函数:
const crawlUrl = async (url) => {
// Open new tab.
const page = await browser.newPage();
await page.goto(url);
// Evaluate code in a context of page and get your data.
const result = await page.evaluate(() => {
return {
title: document.title,
url: window.location.href,
};
});
results.push(result);
// Close it.
await page.close();
};
然后你需要承诺生产者.每次调用此函数时,它都会从URLS_TO_BE_CRAWLED常量中获取一个url并返回crawlUrl(url)promise.一旦URLS_TO_BE_CRAWLED变空,它将返回null,而不是完成池.
const promiseProducer = () => {
const url = URLS_TO_BE_CRAWLED.pop();
return url ? crawlUrl(url) : null;
};
最后,使用您选择的CONCURRENCY执行此操作:
const pool = new PromisePool(promiseProducer, CONCURRENCY);
await pool.start();
由于这是经常被问到的问题,我还在我们的Apify平台https://www.apify.com/mtrunkat/puppeteer-promise-pool-example上做了一个工作示例
编辑12.10.2018
我还要补充一点,我们最近构建了完整的开源SDK,围绕Puppeteer进行并发抓取.它解决了主要的痛苦,例如:
>基于CPU和内存自动调节并发
>使用请求队列重试请求失败
>浏览器的旋转(切换代理)
请查看:https://github.com/apifytech/apify-js