Node.js多页面抓取工具

时间:2015-03-26 09:05:47

标签: javascript node.js

我尝试抓取网站页面。 这里我的示例代码,我使用stackoverflow只是为了测试我不想爬行stackoverflow。

我希望这个代码能够获取页面中的每个链接,然后按下一个数组,然后转到每个链接并搜索Node(它只是测试。)

var request = require('request'); var cheerio = require('cheerio');

var pages = 20;
var counter = 1;
while(counter<=pages){

    var siteUrl = "http://stackoverflow.com/unanswered/tagged/?page="+counter+"&tab=votes";
    var queue = [];
    request(siteUrl, function(error, response, html){
            if(!error){
                var $ = cheerio.load(html);
                // Extract All links in page
                links = $('a');
                $(links).each(function(i, link){
                    queue.push("http://stackoverflow.com"+$(link).attr('href'));
                    });


            }
                // Search For Node.js on every question.
                queue.each(function(i,linkItem){

                    request(linkItem, function(error, response, html){
                        var page = cheerio.load(html);
                        var ser = page.match(/node/i);
                        if (ser & ser.lenght > 0){
                            console.log(page);
                        }
                    });
                })

        })

    counter ++;
}

当我运行此代码时,它只显示frist页面链接并显示错误each has no method

如果告诉我错在哪里,甚至我的代码都是正确的解决方案,我会很高兴。

1 个答案:

答案 0 :(得分:1)

首先,你混合的异步和同步代码并不是很好。 主要问题是您尝试迭代的queue变量没有each方法。您可以使用lodash来执行此操作,或者只使用简单的for循环替换函数调用。

var i,
    item;

for(i = 0; i < queue.length; i++) {
  item = queue[i];
  
  request(item, function(error, response, html){
    var page = cheerio.load(html);
    var ser = page.match(/node/i);
    if (ser & ser.lenght > 0){
      console.log(page);
    }
  });
}

除此之外,我写了一篇tutorial来完成你要做的事情。