nodejs如何在抓取循环中抓取多个站点

时间:2018-04-17 17:00:36

标签: javascript node.js web-scraping web-crawler cheerio

我试图在节点中制作简单的Feed阅读器,并且我在node.js中面临多个请求的问题。例如, 我得到了这段代码:

var url = [
    "https://site1.com",
    "https://site2.com"
]; 
var items = [];
var i;
for(i=0; i<url.length; i++){
    request(url[i], function(err, respone, html){
    if(!err) {
        var $ = cheerio.load(html);
        if(i == 0){
            $(".class1").find("a").each(function (index, element){
                items.push($(element).text());
            });
        }else if(i == 1){
            $(".class1").find("a").each(function (index, element){
                items.push($(element).text());
            });
        }
    }
    });
}

如何在抓取循环中抓取多个站点?

1 个答案:

答案 0 :(得分:0)

在这种情况下,您可以将PromisePromise.all一起使用,因为网络请求可以是异步的。

var urls = [
    "https://site1.com",
    "https://site2.com"
]; 
var promises = [];
   
for(var url of urls) {
  promises.push(new Promise((resolve, reject)=>{
    request(url, function(err, respone, html){
        if(err) {
          return reject(err);
        }
        var $ = cheerio.load(html);
        var items = [];
        $(".class1").find("a").each(function (index, element){
          items.push($(element).text());
        });
        return resolve(items);
    });
  })
}

Promise.all(promises).then((results)=>{
  console.log(results);
}).catch((error)=>{
  console.log(error);
});