Node.js多页爬网程序

Node.js Multi-page Crawler

本文关键字:程序 js Node      更新时间:2023-09-26

我试图爬进网站页面。在我的示例代码中,我使用stackoverflow只是为了测试我不想爬行stackoverflow。

在这段代码中,我想获得页面中的每个链接,然后推送一个数组,然后转到每个链接并搜索Node(这只是测试。)

var request=require('request');var cheerio=需要('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 ++;
}

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

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

首先,异步和同步代码的混合不是很好。主要问题是您尝试迭代的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);
    }
  });
}

此外,我还写了一个教程,教你做你要做的事。