Node.js多页爬网程序
Node.js Multi-page Crawler
我试图爬进网站页面。在我的示例代码中,我使用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);
}
});
}
此外,我还写了一个教程,教你做你要做的事。
相关文章:
- Windows 8市场应用程序JS,访问远程XML文件
- 节点中的端点与快速应用程序.js之间的冲突
- 应用程序.js未在开发中加载(未捕获的引用错误:未定义 $)
- 有没有一种方法可以在IE8中解决我的Rails javascript应用程序.js的问题
- 如何获取应用程序.js其中不包括压缩代码
- 如何让 Mocha 加载定义全局钩子或实用程序的帮助程序.js文件
- 设置应用程序.js使用 git bash 错误
- 带帆的应用程序.js没有缓存浏览器
- 在应用程序.js中访问 io 对象
- 反应.js应用程序.js文件大小
- Windows商店应用程序JS:使用WinJS.xhr上传视频文件
- 推特引导程序 - JS不起作用
- 在文件保护程序.js中保存文件后关闭窗口
- 加载应用程序.js在设备中准备好煎茶触摸科尔多瓦应用程序
- 如何为 hls 创建自定义加载程序.js
- 多变量是节点应用程序.js
- 应用程序.js在部分内不起作用
- 文件保护程序.js 和 Blob.js - 更改目录
- 不知道如何在节点中运行应用程序.js
- 节点应用程序.js如何使用其推荐的功能