Javascript 使用puppeter的并发页面抓取
我如何在新页面实例中跟踪多个链接,以并发和异步的方式对它们进行评估?几乎每个Puppeter方法都会返回一个Javascript 使用puppeter的并发页面抓取,javascript,puppeteer,Javascript,Puppeteer,我如何在新页面实例中跟踪多个链接,以并发和异步的方式对它们进行评估?几乎每个Puppeter方法都会返回一个承诺。因此,您可以使用示例包 首先,您需要创建一个处理一个url的异步函数: const crawlUrl = async (url) => { // Open new tab. const page = await browser.newPage(); await page.goto(url); // Evaluate code in a cont
承诺。因此,您可以使用示例包
首先,您需要创建一个处理一个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();
};
那么你需要承诺制片人。每次调用此函数时,它都会从url\u获取一个url以进行爬网
常量,并返回crawlUrl(url)
promise。一旦url\u TO\u BE\u CRAWLED
为空,它将返回null
,从而完成池
const promiseProducer = () => {
const url = URLS_TO_BE_CRAWLED.pop();
return url ? crawlUrl(url) : null;
};
最后,您可以选择并发方式执行此操作:
const pool = new PromisePool(promiseProducer, CONCURRENCY);
await pool.start();
由于这是一个经常被问到的问题,我还在我们的Apify平台上做了一个工作示例
2018年10月12日编辑
我还想补充一点,我们最近围绕与Puppeter的并发抓取构建了完整的开源SDK。它解决了以下主要问题:
- 基于CPU和内存的自动缩放并发
- 使用请求队列重试请求失败
- 浏览器的旋转(切换代理)
请访问:Mareks解决方案适合于几个页面,但如果您想同时抓取大量页面,我建议您查看我的库
它并行运行任务(如Mareks解决方案),但也负责错误处理、重试和其他一些事情。您可以在下面看到一个最小的示例。也可以在更复杂的设置中使用库
const{Cluster}=require('puppeter-Cluster');
(异步()=>{
const cluster=等待cluster.launch({
并发性:Cluster.concurrency\u CONTEXT,//每个工作者使用一个浏览器
maxConcurrency:4,//具有四个工作进程的集群
});
//定义要为数据执行的任务
等待cluster.task(异步({page,data:url})=>{
等待页面。转到(url);
const screen=wait page.screenshot();
// ...
});
//队列URL
cluster.queue('http://www.google.com/');
cluster.queue('http://www.wikipedia.org/');
// ...
//等待群集空闲并关闭它
等待cluster.idle();
等待cluster.close();
})();
到目前为止,您尝试了什么?哪些有效,哪些无效?如果在并发状态下运行浏览器并解析单个域可能导致请求被阻止,您将如何添加一个简单的代理切换器?如果您有一个示例代码段示例,将不胜感激。