[英]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.