HTTP爬虫
网络上每时每刻都有海量的请求,有从客户端到服务器端的,也有服务器端到服务器端的
一般在浏览器里,我们是通过ajax来完成表单的提交或者是数据的获取,
那在http模块里呢get和request这两个接口来完成数据的获取或者是提交。
来个实例,爬一下51cto博客的数据
先从最简单的爬虫开始,爬源码
示例代码如下:
var http = require(‘http‘) var url = ‘http://mazongfei.blog.51cto.com/3174958/1909817‘ http.get(url, function(res){ var html = ‘‘ 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
var http = require(‘http‘) var cheerio = require(‘cheerio‘) var url = ‘http://www.imooc.com/learn/348‘ function filterChapters(html){ var $ = cheerio.load(html) var chapters = $(‘.chapter‘) //我们想拿到一个数组,格式如下: /*[{ chapterTitle:‘‘, videos:[ title:‘‘, id:‘‘ ] }]*/ var courseData = [] //遍历的里面拿到数据 chapters.each(function(item){ var chapter = $(this); //章节标题 var chapterTitle = chapter.find(‘strong‘).text() console.log(chapterTitle) var videos = chapter.find(‘.video‘).children(‘li‘) var chapterData = { chapterTitle:chapterTitle, videos:[] } //遍历videos videos.each(function(item){ var video = $(this).find(‘.J-media-item‘) var videoTitle = video.text() var id = video.attr(‘href‘).split(‘video/‘)[1] chapterData.videos.push({ title:videoTitle, id:id }) }) courseData.push(chapterData) }) return courseData } function printCourseInfo(courseData){ //数组中的遍历 courseData.forEach(function(item){ var chapterTitle = item.chapterTitle item.videos.forEach(function(video){ console.log(‘【‘+video.id+‘】‘+video.title); }) }) } http.get(url, function(res){ var html = ‘‘ res.on(‘data‘,function(data){ html += data }) res.on(‘end‘,function(){ //处理 var courseData = filterChapters(html) printCourseInfo(courseData) }).on(‘error‘,function(){ console.log(‘获取页面出错‘) }) })
运行结果如下:
如果出错,进行console.log进行调试
有了编号,我们就可以自己组装url地址【6712】并单独访问每一节的内容,
可以做更多的事情,目前爬虫代码先到此为止。
但还有另外一个问题:如果把每一节的内容都跑出来的话,
在代码中的表现形式都是回调,在此只拿课程主页这个内容,
如果去请求每一节的内容的话是异步的不一定是多长时间可以拿到内容,
所以是回调的话,就是一个不知时间长短的回调;所以就有一种异步
的回调编程方式,来让我们组装好队列,得到我们想要的结果
本文出自 “IT菜鸟” 博客,请务必保留此出处http://mazongfei.blog.51cto.com/3174958/1910188
原文地址:http://mazongfei.blog.51cto.com/3174958/1910188