javascript - Node.js 网络抓取,在 URL 数组上循环

标签 javascript node.js callback promise

我正在尝试构建一个小脚本来收集一些数据。我有一些 javascript 的基础知识,但是我有点迷失了所有异步回调或 promise 的东西。这是我现在拥有的:

url = "http://Blablablabla.com";

var shares = function(req, res) {
    request(url, function (error, response, body) {
  if (!error) {
    var $ = cheerio.load(body),
      share = $(".theitemIwant").html();

    return res.send(url + ":" + share);
  } else {
    console.log("We've encountered an error: " + error);
  }
})

}

所以这段代码一切正常。我想做的是:

  1. 使用 url 数组 var urls = [url1,url2,url3,etc...]
  2. 将我的废弃数据存储到另一个数组中,类似这样的 data = [{url: url1, shares: share},{url: url2, shares: share},etc...]>/li>

我知道我需要使用这样的东西 data.push({ urls: url, shares: share})})

我知道我需要遍历我的第一个 url 数组以将数据推送到我的第二个数据数组中。

然而,我对 request 方法以及在我的情况下处理异步问题的方式有点迷茫。

谢谢!

编辑#1:

我试过使用 promises :

var url = "www.blablabla.com"
var geturl = request(url, function (error, response, body) {
  if (!error) { return $ = cheerio.load(body) } else 
  { console.log("We've encountered an error: " + error); }
});

var shares = geturl.then( function() {
    return $(".nb-shares").html();
})

但出现以下错误 geturl.then is not a function

最佳答案

我认为你应该使用 async :

var async = require('async');

var urls = ["http://example.com", "http://example.com", "http://example.com"];
var data = [];
var calls = urls.map((url) => (cb) => {
    request(url, (error, response, body) => {
        if (error) {
            console.error("We've encountered an error:", error);
            return cb();
        }
        var $ = cheerio.load(body), 
            share = $(".theitemIwant").html();
        data.push({ url, share })
    })
})

async.parallel(calls, () => { /* YOUR CODE HERE */ })

你可以对 promise 做同样的事情,但我不明白为什么。

关于javascript - Node.js 网络抓取,在 URL 数组上循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39649237/

相关文章:

javascript - 通过 compose() 使用的 graphQL 突变的回调

javascript - 使用 array.length 时无限循环

javascript - 可过滤的自动完成,在 Flask 中使用 ajax

动态编写脚本时无法访问 Javascript 函数

javascript - 如何在用户第一次点击 JavaScript 后创建另一个点击

node.js - 如何在 Mongoose 中以数组格式填充值

IOS 在流式传输视频时检测调用中断

javascript - Passportjs 如何返回验证结果而不是重定向到另一个页面

node.js - 无法使用查找查询在 Mongoose 中查找数据

node.js - 从 REST-api 和模板预渲染静态网站?