【问题标题】:How to process large number of requests with promise all如何使用 promise all 处理大量请求
【发布时间】:2019-02-07 15:28:19
【问题描述】:

我有大约 5000 个链接,我需要抓取所有这些链接。所以我想知道有没有比这更好的方法。这是我的代码。

let urls = [ 5000 urls go here ];

const doms = await getDoms(urls);

// processing and storing the doms

getDoms = (urls) => {

  let data = await Promise.all(urls.map(url => {
    return getSiteCrawlPromise(url)
  }));
  return data;

}

getSiteCrawlPromise = (url) => {

  return new Promise((resolve, reject) => {
    let j = request.jar();
    request.get({url: url, jar: j}, function(err, response, body) {
        if(err)
          return resolve({ body: null, jar: j, error: err});
        return resolve({body: body, jar: j, error: null});
    });
  })

} 

promise 中是否实现了一种机制,以便可以将作业分配给多个线程和进程。然后将输出作为一个整体返回? 而且我不想将网址分成更小的片段并处理这些片段

【问题讨论】:

    标签: node.js request web-crawler es6-promise


    【解决方案1】:

    Promise 对象表示异步操作的最终完成(或失败)及其结果值。

    Promises 中没有“将作业划分为多个线程和进程”的内置机制。如果必须这样做,则必须将 urls 数组分段为更小的数组,并将分段数组同时排队到单独的爬虫实例中。

    但是,完全没有必要这样做,因为你使用的是 node-js 和 node-crawler,你可以使用 node-crawler 的maxConnections 选项。 这就是它的目的,最终结果是一样的。您将在多个线程上抓取 url,而不会浪费时间和精力来手动分块和处理多个爬虫实例,或者依赖于任何并发库。

    【讨论】:

      【解决方案2】:

      至少现在,Javascript 还没有内置这样的机制。

      您可以使用提供更多功能的第三方 Promise 库,例如 Bluebird,您可以在其中使用它们的并发功能:

      const Promise = require('bluebird');
      
      // Crawl all URLs, with 10 concurrent "threads".
      Promise.map(arrayOfUrls, url => {
          return /* promise for crawling the url */;
      }, { concurrency: 10 });
      

      另一种选择是使用专用的限制库(我强烈推荐bottleneck),它可以让您表达任何通用类型的速率限制。这种情况下的语法与您已有的语法相似:

      const Bottleneck = require('bottleneck');
      const limit = new Bottleneck({ maxConcurrent: 10 });
      
      const getCallSitePromise = limit.wrap(url => {
          // the body of your getCallSitePromise function, as normal
      });
      
      // getDoms stays exactly the same
      

      可以自己解决这个问题,但是带上一个(或两个!)上面的库将为您节省大量代码。

      【讨论】:

        猜你喜欢
        • 2015-04-29
        • 1970-01-01
        • 2013-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多