1

首先,这是我迄今为止取得的进展的代码:

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 规则有效地抓取每个页面,这些规则将添加到相应博主的多维数组中.

我该怎么办?

4

3 回答 3

1

我在我的一个抓取工作中做了类似的事情,但我使用async.js库来完成。请注意,我还在抓取中使用了请求模块和cheerio.js。我从单个网页中获取并抓取数据行,但怀疑您可以执行类似的操作来获取 URL 并以相同的方式请求/抓取它们。

我也承认这是非常基本的编码,当然可以通过一些重构来优化。希望它至少能给你一些想法......

首先,我使用 request 来获取页面并调用我的解析函数 -

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();
    });
}
于 2014-01-26T03:23:27.687 回答
0

你已经定义了a = 0;所以

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

所有这些语句都会引发错误,因为 Array 只能以整数作为键。

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);
于 2013-12-13T17:52:09.303 回答
0

在您的循环中,只需使用您抓取的属性创建一个对象,然后将该对象推送到您的数组中。

var blogInfo = {
  blogName: blogName,
  followLink: "http://www.bloglovin.com"+followLink;
  blogSite: blogSite
};
myArray.push(blogInfo);
于 2013-12-13T18:16:48.160 回答