Node.js(九)——HTTP小爬虫
HTTP爬虫
网络上每时每刻都有海量的请求,有从客户端到服务器端的,也有服务器端到服务器端的
一般在浏览器里,我们是通过ajax来完成表单的提交或者是数据的获取,
那在http模块里呢get和request这两个接口来完成数据的获取或者是提交。
来个实例,爬一下51cto博客的数据
先从最简单的爬虫开始,爬源码
示例代码如下:
varhttp=require('http')varurl='http://mazongfei.blog.51cto.com/3174958/1909817'http.get(url,function(res){varhtml=''res.on('data',function(data){html+=data})res.on('end',function(){console.log(html)}).on('error',function(){console.log('获取博客页面出错')})})
运行结果态度,截取一段如下:
源码虽然爬下来了,但是对我们来说没有多大意义,我们想拿到博客的标题信息,(因知识储备不够,未能爬到博客的代码,初步理解是Reboot文件)改爬慕课网
那这个时候就需要我们分析源码,把有价值的东西给筛选出来;
我们怎么对源码进行分析呢,这里推荐一个模块:cherio
它就像jquery一样能够操作装载后台html,简单而又方便
首先先安装一下该模块: npm install cheerio
varhttp=require('http')varcheerio=require('cheerio')varurl='http://www.imooc.com/learn/348'functionfilterChapters(html){var$=cheerio.load(html)varchapters=$('.chapter')//我们想拿到一个数组,格式如下:/*[{chapterTitle:'',videos:[title:'',id:'']}]*/varcourseData=[]//遍历的里面拿到数据chapters.each(function(item){varchapter=$(this);//章节标题varchapterTitle=chapter.find('strong').text()console.log(chapterTitle)varvideos=chapter.find('.video').children('li')varchapterData={chapterTitle:chapterTitle,videos:[]}//遍历videosvideos.each(function(item){varvideo=$(this).find('.J-media-item')varvideoTitle=video.text()varid=video.attr('href').split('video/')[1]chapterData.videos.push({title:videoTitle,id:id})})courseData.push(chapterData)})returncourseData}functionprintCourseInfo(courseData){//数组中的遍历courseData.forEach(function(item){varchapterTitle=item.chapterTitleitem.videos.forEach(function(video){console.log('【'+video.id+'】'+video.title);})})}http.get(url,function(res){varhtml=''res.on('data',function(data){html+=data})res.on('end',function(){//处理varcourseData=filterChapters(html)printCourseInfo(courseData)}).on('error',function(){console.log('获取页面出错')})})
运行结果如下:
如果出错,进行console.log进行调试
有了编号,我们就可以自己组装url地址【6712】并单独访问每一节的内容,
可以做更多的事情,目前爬虫代码先到此为止。
但还有另外一个问题:如果把每一节的内容都跑出来的话,
在代码中的表现形式都是回调,在此只拿课程主页这个内容,
如果去请求每一节的内容的话是异步的不一定是多长时间可以拿到内容,
所以是回调的话,就是一个不知时间长短的回调;所以就有一种异步
的回调编程方式,来让我们组装好队列,得到我们想要的结果
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。