最近在学习node.js,在imooc网学习,Scott老师讲怎么样用node.js爬imooc网络的课程,下面是实现代码:
var http = require('http'); var cheerio = require('cheerio');//处理获取的html模块 var url = 'http://www.imooc.com/learn/348'; /** * 处理获取到的html代码*/ function setHtml(html) { var $ = cheerio.load(html);//加开获取的字符串的html var chapters = $('.chapter');//就像jquery一样,操控class获取DOM var courseData = []; chapters.each(function (item) {//chapters这个class被获取到了多个,这里要each每一个 var chapterstitle = $(this).find('strong').text().split('\n')[2];//拿到章标题 var video = $(this).find('.video').children('li');//获取小节可 循环 部分 var chapterData = { chapterstitle:trim(chapterstitle), videos:[] }; video.each(function (items) { var setAhref = $(this).find('.J-media-item'); var childTitle = setAhref.text().replace(/\n/g,'').replace(/\r/,'').replace(/开始学习/,''); var childId = setAhref.attr('href').split('video/')[1]; chapterData.videos.push({// push() 方法可向数组的末尾添加一个或多个元素,并返回新的长度。 childTitle:trim(childTitle), childId:childId }); }); courseData.push(chapterData); //console.log(chapterstitle+'\n'); }); return courseData; } /** 遍历处理后的数组并打印*/ function foreach(resultHtml) { resultHtml.forEach(function (item,index) { console.log('=='+item.chapterstitle+'\n'); item.videos.forEach(function (item1,index) { console.log('---['+item1.childId+']-'+item1.childTitle+'\n'); }) }); } //去掉字符串中所有空白; function trim(str) { var result = str.replace(/\s/g,""); return result; } //http的get请求 http.get(url,function (res) { var html = ''; res.on('data',function (data) {//返回数据流,会获取不定次,将每次的累加得到所有html代码 html += data; }); res.on('end',function () {//请求完成事件 var resultHtml = setHtml(html);//处理html并返回处理结果 foreach(resultHtml);//循环数组,显示列表 //console.log(resultHtml); }); }).on('error',function () { console.log('请求错误或地址不正确!'); });
执行结果:
==第1章前言 ---[6687]-1-1Node.js基础-前言(01:20) ---[6688]-1-2为什么学习Nodejs(05:43) ==第2章安装Nodejs ---[6689]-2-1Node.js基础-课程简介(01:19) ---[6690]-2-2Nodejs版本常识(01:02) ---[6691]-2-3Windows下安装Nodejs(04:43) ---[6692]-2-4Linux下安装Nodejs(06:24) ---[6693]-2-5Mac下安装Nodejs(03:55) ......