Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用puppeter的并发页面抓取_Javascript_Puppeteer - Fatal编程技术网

Javascript 使用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

我如何在新页面实例中跟踪多个链接,以并发和异步的方式对它们进行评估?

几乎每个Puppeter方法都会返回一个
承诺。因此,您可以使用示例包

首先,您需要创建一个处理一个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();
})();

到目前为止,您尝试了什么?哪些有效,哪些无效?如果在并发状态下运行浏览器并解析单个域可能导致请求被阻止,您将如何添加一个简单的代理切换器?如果您有一个示例代码段示例,将不胜感激。