我尝试抓取网站页面。 这里我的示例代码,我使用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
如果告诉我错在哪里,甚至我的代码都是正确的解决方案,我会很高兴。
答案 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来完成你要做的事情。