node.js + cheerio scrape:传递一个url数组下载?

首先,这是我的代码,因为我已经进步到目前为止:

var http = require("http"); // Utility function that downloads a URL and invokes // callback with the data. function download(url, callback) { http.get(url, function(res) { var data = ""; res.on('data', function (chunk) { data += chunk; }); res.on("end", function() { callback(data); }); }).on("error", function() { callback(null); }); } var cheerio = require("cheerio"); var url = "http://www.bloglovin.com/en/blogs/1/2/all"; var myArray = []; var a = 0; var getLinks = function(){download(url, function(data) { if (data) { // console.log(data); var $ = cheerio.load(data); $(".content").each(function(i, e) { var blogName = $(e).find(".blog-name").text(); var followLink = $(e).find("a").attr("href"); var blogSite = $(e).find(".description").text(); myArray[a] = [a]; myArray[a]["blogName"] = blogName; myArray[a]["followLink"] = "http://www.bloglovin.com"+followLink; myArray[a]["blogSite"] = blogSite; a++; console.log(myArray); }); } }); } getLinks(); 

正如你所看到的, followLinks被连接到followUrl ,我想通过'url'下载,所以有效地我将使用相同的CSS规则,每个页面将被添加到多维arrays为相应的博客。

我怎样才能解决这个问题?

我在做一个类似的工作,但我使用async.js库来完成。 请注意,我也在使用请求模块和cheerio.js 。 我从单个网页中获取和刮取数据行,但怀疑可以采取类似的方式来获取URL并以相同的方式请求/擦除这些数据。

我也承认这是相当基本的编码,当然可以通过一些重构来优化。 希望至less给你一些想法…

首先,我使用请求来获取页面并调用我的parsing函数 –

 var url = 'http://www.target-website.com'; function(lastCallback) { request(url, function(err, resp, body) { if(!err) { parsePage(err, resp, body, lastCallback); } else { console.log('web request error:' + resp.statusCode); } } } 

接下来,在我的parsePage函数中,我将网站加载到Cheerio中,将每个数据行的HTML获取到一个数组中,将我的parseRow函数和每个HTML片段推送到另一个数组中,并使用async.parallel来处理每个迭代 –

 var rows = []; function parsePage(err, resp, body, callback1) { var $ = cheerio.load(body); $('div#targetTable tr').each(function(i, elem) { rows.push($(this).html()); }); var scrRows = []; rows.forEach(function(row) { scrRows.push(function(callback2) { parseRow(err, resp, row); callback2(); }); async.parallel(scrRows, function() { callback1(); }); } 

在你的循环内,只需用你所需要的属性创build一个对象,然后将该对象推送到你的数组中。

 var blogInfo = { blogName: blogName, followLink: "http://www.bloglovin.com"+followLink; blogSite: blogSite }; myArray.push(blogInfo); 

你已经定义a = 0; 所以

 myArray[a] = [a]; // => myArray[0] = [0]; myArray[0] becomes an array with 0 as only member in it 

所有这些语句抛出一个错误,因为数组可以只有整数作为键。

 myArray[a]["blogName"] = blogName; myArray[a]["followLink"] = "http://www.bloglovin.com"+followLink; myArray[a]["blogSite"] = blogSite; 

相反,试试这个:

 var obj = { index: a, blogName: blogName, followLink: "http://www.bloglovin.com" + followLink, blogSite: blogSite } myArray.push(obj); console.log(myArray);