首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用requestJS和cheerioJS抓取URL列表并将数据存储在全局变量中?

如何使用requestJS和cheerioJS抓取URL列表并将数据存储在全局变量中?
EN

Stack Overflow用户
提问于 2016-07-21 08:01:18
回答 1查看 233关注 0票数 0

我有一个网址列表,大概有4个。对于每个变量,我都想收集一些信息并将其存储到一个名为allData的全局变量中。所以我的代码看起来像这样:

代码语言:javascript
复制
var request = require('request');
var cheerio = require('cheerio');

var urls = [url1,url2,url3,url4];
var allData = [];

for(var url in urls){
      request(url, function(err,response,body){
         var $ = cheerio.load(body);
         var data = $('h1.large','#title_main').text();
         allData.push(data);
   });
}

然而,我意识到由于使用request的异步特性,这将不会起作用。在最后一个循环中,"datas“中的所有数据都是相同的,并且都来自url4。你知道我怎么解决这个问题吗?真的需要这个功能。

EN

回答 1

Stack Overflow用户

发布于 2017-04-29 04:27:46

很高兴你找到了一个适合你的解决方案。

9个月过去了,您可能已经知道了这一点,但是为了将来的参考,您还可以使用一些原生的javascript Array函数来“关闭”每次迭代的作用域(并避免对您的项目产生另一个依赖项) --我在我的一些使用.forEach()的internet抓取器中总是这样做

代码语言:javascript
复制
urls.forEach(function(url){
    request(url, function(err,response,body){
        var $ = cheerio.load(body);
        var data = $('h1.large','#title_main').text();
        allData.push(data);
    });
})

Array.prototype中有一些基于函数式编程的方法,它们允许您对数组中数据的每次迭代(实质上是冻结进入函数的参数)执行函数。有几个像.forEach()这样的函数允许您关闭包含异步代码的循环中的参数。

上面的代码导致四个方法异步执行。每个方法都被传递给数组中的一个url。当每个请求完成时,allData将从requests/cheerio解析的内容中追加结果。

如果您需要它们按顺序排列,您可以访问随每个forEach函数迭代一起传递的index

代码语言:javascript
复制
urls.forEach(function(url,index){
    request(url, function(err,response,body){
        var $ = cheerio.load(body);
        var data = $('h1.large','#title_main').text();
        allData[index]=data;
    });
})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38492703

复制
相关文章

相似问题

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