最近在学习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) ......