最近跟着慕课网的Scott老师课程写了个小爬虫,爬取当前学习课程的课程列表信息,由于当前该页面的源码修改过了不再是视频中的那个源码了,所以按照老师的代码是爬取不了的,对于爬取修改的这部分就苦搞了一个下午才搞定(毕竟自己学的javascript很渣....)。给我很大惊喜的是使用Nodejs来写爬虫,不再需要用正则表达式这个恶心的东西了来爬取自己想要的数据,使用Nodejs中的cheerio模块(用法和jquery几乎一样)来选择自己需要爬取的标签数据就相当于用javascript中使用jquery来选择当前页面的标签数据,实现起来相当简单;下面直接来看代码:
/**
* Created by Turne on 2017/2/10.
*/
var http = require('http');
var url = 'http://www.imooc.com/learn/348';//当前需要爬取的url地址
var cheerio = require('cheerio');//cheerio模块使用方法几乎和jquery一样
function printinfo(coureData) {//打印已经爬好的数据
coureData.forEach(function (item) {
console.log(item.chapterTitle + '\n');//打印每一章的标题
item.videos.forEach(function (video) {
console.log(' 【' + video.id + '】 '+ video.title + '\n');//打印每个视频的id和小标题
})
})
}
function selecttHtml(html) {//选择自己需要爬取该页面中的那些数据
var $ = cheerio.load(html);//解析HTML代码
var contents = $('.chapter');//选择类名为chapter的所有标签
var courseData = [];
contents.each(function (item) {
var content = $(this);
var text = content.find('.chapter-content').text();
var chapterTitle = content.find('strong').text().split(text)[0].trim();//当前章节的标题
var videos = content.find('.video').children('li');//所有视频的信息
var chapterData = {//每一章数据保存的对象格式
chapterTitle:chapterTitle,
videos: []
};
videos.each(function (item) {
var video = $(this).find('a');
var title = video.text().split('开始学习')[0].trim();
//console.log(title.length);
title = title.substring(0,title.length - 10).trim() + " " + title.substring(title.length - 10,title.length).trim();
var id = video.attr('href').split('video/')[1];
chapterData.videos.push({
title:title,//每个视频的标题
id:id//每个视频的id
})
})
courseData.push(chapterData)
})
return courseData;
}
http.get(url,function(res){//获取url地址的源码
var html = '';
res.on('data',function (data) {//当触发data事件时,就把当前返回的数据保存起来
html += data.toString('utf-8');
})
res.on('end',function(){//当触发end事件时,即响应已结束,即整个源码都已获取成功了
//console.log(html);
var courseData = selecttHtml(html);
printinfo(courseData);
})
})