node做爬虫的优势:
第一个就是他的驱动语言是JavaScript。JavaScript在nodejs诞生之前是运行在浏览器上的脚本语言,其优势就是对网页上的dom元素进行操作,在网页操作上这是别的语言无法比拟的。
第二就是nodejs是单线程异步的,一个页面未返回不会阻塞其它页面加载。
node做爬虫的劣势:
首先是异步并发上。处理的好很方便,处理的不好就会很麻烦。例如要爬取10个页面,用node不做异步处理话,那返回的结果可不一定是按1、2、3、4……这个顺序,很可能是随机。解决的办法就是增加一个页面的序列戳,让爬取的数据生成csv文件,然后重新排序。
第二个是数据处理上的劣势,这点是不如python的,如果只是单纯的爬数据,用node当然很好,但是如果用爬来的数据继续做统计分析,做个回归分析聚类啥的话,那就不能用node一步到底了。
下面就要说一下如何用nodejs做爬虫了
1、初始化项目文件
在对应的项目文件夹下执行npm init来初始化一个package.json文件
2、安装request和cheerio依赖包
request听起来很熟悉吧,跟python里request功能一样。它的功能就是建立起对目标网页的链接,并返回相应的数据,这个不难理解。
cheerio的功能是用来操作dom元素的,他可以把request返回来的数据转换成可供dom操作的数据,更重要的cheerio的api跟jquery一样,用$来选取对应的dom结点,是不很方便?对一个前端程序员来说,这比python的什么xpath和beautisoup方便了不知道多少啊哈哈
安装命令也很简单,分别是npm install request --save和npm install cheerio
3、引入依赖包并使用
接下来就用request和cherrio写一个爬虫吧!
首先引入依赖
var request = require("request"); var cheerio = require("cheerio");
接下来就以爬取我们学校的新闻页为例吧,我们学校的新闻页面链接是http://news.shu.edu.cn/Default.aspx?tabid=446
然后调用request的接口
request('http://news.shu.edu.cn/Default.aspx?tabid=446',function(err,result){ if(err){ console.log(err); } console.log(result.body); })
将request返回的结果传入cheerio中,并获得想要获取的信息
request('http://news.shu.edu.cn/Default.aspx?tabid=446',function(err,result){ if(err){ console.log(err); } var $ = cheerio.load(result.body); $('a[id^="dnn"]').each(function(index,element){ console.log($(element).text()); }) })
4、设置请求头
具体事例代码如下:
var options = { url: startUrl+'?page=1', method: 'GET', charset: "utf-8", headers: { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36", "cookie": cookies } }; request(options,function(err,response,body){ //... })
5、并发控制
爬取一个页面还好,要是页面多了就是无限制并发了,那肯定就要被封了,所以就要有一个并发控制,这里要介绍的就是async。跟上述一样要通过npm install async --save来安装并通过var async = require("async")来引入。
具体以一个限制并发的方式来示例一下
async.mapLimit(5,function(url,callback)){ //... fetch(url,callback) })
以上就是node可以做爬虫吗?的详细内容,更多请关注0133技术站其它相关文章!