node.js爬虫前端同学可能对爬虫不是很感兴趣,认为爬虫需要用到后端语言,比如php、python等,当然这是在节点之前。nodejs的出现使得Javascript也可以用来写爬虫了。由于nodejs强大的异步特性,我们可以轻松爬取异步高并发的网站。当然这里的ease指的是cpu的开销。看懂这篇文章,其实只需要懂Javascript和JQuery即可简单的基于nodejs的http网络抓取和基于URL的Nodejs作为爬虫的优缺点首先说说node作为爬虫的优势。首先是它的驱动语言是JavaScript。在nodejs诞生之前,JavaScript是一种运行在浏览器上的脚本语言。它的优点是可以对网页上的dom元素进行操作,这在网页操作方面是其他语言无法比拟的。二是nodejs是单线程异步的。听起来很奇怪,单线程怎么可以是异步的呢?当你想到学习操作系统时,为什么单核CPU可以执行多任务处理?原因类似。在操作系统中,进程以时间片的方式占用CPU。每个进程占用的时间很短,但是所有进程都循环了很多次,所以看起来就像是在同时处理多个任务。js也是一样。js中有一个事件池。CPU会循环处理事件池中的响应事件。未处理的事件不会放入事件池中,因此不会阻塞后续操作。这样做对爬虫的好处是,在并发爬取的页面上,如果一个页面没有返回,不会阻塞后续页面继续加载。为此,不需要像python那样使用多线程。其次是节点的劣势。首先,它是异步和并发的。处理好方便,处理不好就麻烦了。比如你要爬取10个页面,使用node不做异步处理,返回的结果不一定是1,2,3,4的顺序……有可能是随机的。解决办法是加一个页面顺序戳,让爬取的数据生成csv文件,然后重新排序。二是数据处理的劣势,不如python。如果只是简单的爬取数据,用node当然好,但是如果继续对爬取的数据做统计分析,做一个回归分析和聚类,那么到最后一步就不能使用node了。如何使用nodejs做爬虫先说说如何使用nodejs做爬虫1.初始化项目文件在对应的项目文件夹下执行npminit,初始化一个package.json文件2.安装request和cheerio依赖包request听起来很好熟悉,和python中的request函数是一样的。它的作用是建立到目标网页的链接,并返回相应的数据,这个不难理解。cheerio的作用是操作dom元素。它可以将请求返回的数据转换成dom可以操作的数据。更重要的是,cheerio的API和jquery是一样的。用$选择对应的dom节点对不对?很方便?对于一个前端程序员来说,这比python的xpath和beautisoup方便多了。我不知道它是多少。哈哈,安装命令也很简单:分别是npminstallrequest--save和npminstallcheerio3,导入依赖包即可使用。用request、fs和cherrio写一个爬虫!首先引入依赖模块varhttp=require("http");//网络请求varfs=require("fs");//操作文件,读写文件varcheerio=require("cheerio");//扩展模块注意:cheerio模块是第三方模块,需要安装:npminstallcheerio--save接下来以我之前爬取的百度新闻页面为例。为什么选择这个,因为这个是最基本最简单的。百度新闻页面链接为:http://news.baidu.com/执行以下代码:varhttp=require("http");varfs=require("fs");constwz="http://news.baidu.com/";//URLvarstrHtml="";varresults=[];http.get(wz,function(res){res.on("data",function(chunk){strHtml+=chunk;})res.on("end",function(){console.log(strHtml);});})运行后结果是这样的,是不是很刺激,哈哈,html又回来了。这还是不够,下一步就是对返回的数据进行处理,提取出我们想要获取的信息。轮到cheerio了。将请求返回的结果传入cheerio,得到你想要的信息。看着代码,有没有写脚本的感觉?接下来,让我们执行本节中的以下代码:varhttp=require("http");varfs=require("fs");varcheerio=require("cheerio");constwz="http://news.baidu.com/";varstrHtml="";varresults=[];http.get(wz,function(res){res.on("data",function(chunk){strHtml+=chunk;})res.on("end",function(){//console.log(strHtml);var$=cheerio.load(strHtml);$("#channel-allli").each((iten,i)=>{console.log($(i).text());})});})运行后结果如下:这样一个简单的爬虫就完成了,是不是很简单?然后简单介绍下node.js爬取图片。以下是我们要抓取的图片:首先,我们还需要像上面那样引入一些需要的核心模块。varhttp=require("http");varhttps=require("https");varfs=require("fs");varcheerio=require("cheerio");注意:cheerio模块是第三方模块,需要安装:npminstallcheerio--save//保存网络图片functionsaveImage(imageUrl){http.get(imageUrl,function(res){res.setEncoding('binary');//binary(二进制)varimageData='';res.on('data',function(data){//图片加载到内存变量imageData+=data;}).on('end',function(){//加载图片后保存if(!fs.existsSync("./images")){fs.mkdirSync("./images");}fs.writeFile('images/'+Math.random()+'.png',imageData,'binary',function(err){//以二进制格式保存if(err)throwerr;console.log('保存成功');});});});}nodejs爬虫总结①http.get+cheerio+iconv-lite这种方法比较简单易懂,直接使用httpget方法请求url,将获取到的内容解析到cheerio,使用jquery解析出我们想要的。要点:如何解决获取结果中的中文乱码,只需使用iconv-lite模块对获取的内容进行转码即可。http.get(options,function(result){varbody=[];result.on('data',function(chunk){body.push(chunk);});result.on('end',function(){varhtml=iconv.decode(Buffer.concat(body),'gb2312');//注意这里body是一个数组var$=cheerio.load(html);...});});②request+Cheerio+iconv-lite在获取内容的方式上有些不同,可以直接获取Buffer类型的数据。然后将得到的内容解析到cheerio中,用jquery解析出我们想要的内容。要点:如何解决中文乱码的结果,直接使用iconv-lite模块对获取的内容进行转码即可。request(options,function(err,res,body){if(err)console.log(err);if(!err&&res.statusCode==200){varhtml=iconv.decode(body,'gb2312');//这里body直接获取Buffer类型的数据,可以直接解码var$=cheerio.load(html);...}});③superagent+cheerio+superagent-charset这种方式比前面两种好有很大的区别,superagent的get方法是用来发起请求的,superagent-charse是用来解码的,用法还是很简单的,然后把获取到的内容用cheerio解析,jquery方法用来解析出我们想要的就可以了。划重点:结果中文乱码是使用superagent-charset模块进行转码解决的,方法和上面有点区别。先看它的加载方式:varcharset=require("superagent-charset");varsuperagent=charset(require("superagent"));//将superagent模块传给superagent-charset解码方式:superagent.get(url).charset('gb2312')//使用charset方式实现解码效果。.end(function(err,result){if(err)console.log(err);var$=cheerio.load(result.text);...});至此,Nodejs爬虫的核心已经介绍完了,剩下的完全自由发挥
