繁体   English   中英

Node.js多页爬网程序

[英]Node.js Multi-page Crawler

我尝试抓取网站页面。 在这里,我的示例代码中,我仅使用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 ++;
}

当我运行此代码时,它只显示第一个页面链接并显示错误, 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); } }); } 

此外,我写了一个教程来准确地完成您要尝试的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM