首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Puppeteer进行并发页面抓取

使用Puppeteer进行并发页面抓取
EN

Stack Overflow用户
提问于 2017-12-06 21:08:21
回答 2查看 6.3K关注 0票数 5

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

EN

回答 2

Stack Overflow用户

发布于 2018-09-07 02:10:46

Mareks解决方案适用于几个页面,但如果您想同时抓取大量页面,我建议您查看我的库puppeteer-cluster

它并行运行任务(像Mareks解决方案),但也负责错误处理、重试和其他一些事情。你可以在下面看到一个最小的例子。也可以在更复杂的环境中使用该库。

代码语言:javascript
复制
const { Cluster } = require('puppeteer-cluster');

(async () => {
  const cluster = await Cluster.launch({
    concurrency: Cluster.CONCURRENCY_CONTEXT, // use one browser per worker
    maxConcurrency: 4, // cluster with four workers
  });

  // Define a task to be executed for your data
  await cluster.task(async ({ page, data: url }) => {
    await page.goto(url);
    const screen = await page.screenshot();
    // ...
  });

  // Queue URLs
  cluster.queue('http://www.google.com/');
  cluster.queue('http://www.wikipedia.org/');
  // ...

  // Wait for cluster to idle and close it
  await cluster.idle();
  await cluster.close();
})();
票数 9
EN

Stack Overflow用户

发布于 2017-12-18 23:00:02

几乎每个Puppeteer方法都返回一个Promise。因此您可以使用例如https://www.npmjs.com/package/es6-promise-pool包。

首先,您需要创建一个处理一个url的异步函数:

代码语言:javascript
复制
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();
};

然后你需要promise producer。每次调用此函数时,它都会从URLS_TO_BE_CRAWLED常量中获取一个url并返回crawlUrl(url) promise。一旦URLS_TO_BE_CRAWLED为空,它将返回null,这将结束池。

代码语言:javascript
复制
const promiseProducer = () => {
    const url = URLS_TO_BE_CRAWLED.pop();

    return url ? crawlUrl(url) : null;
};

最后,您可以使用您选择的并发性来执行此操作:

代码语言:javascript
复制
const pool = new PromisePool(promiseProducer, CONCURRENCY);
await pool.start();

由于这是一个经常被问到的问题,我还在我们的Apify平台https://www.apify.com/mtrunkat/puppeteer-promise-pool-example上做了一个工作示例

编辑12.10.2018

我还想补充说,我们最近围绕Puppeteer的并发抓取构建了整个开源SDK。它解决了主要的问题,例如:

使用浏览器的请求queue

  • rotation (切换代理)基于CPU和memory

  • failed请求重试的
  • 自动扩展并发性

请访问:https://github.com/apifytech/apify-js

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47675081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档