var?http?=?require('http');
var?cheerio?=?require('cheerio');
//?var?Promise?=?window.Promise; //WINDOW?is?not?defined
//?var?Promise?=?require('Promise'); //can?not?find?module?"Promise"
var?Promise?=?require('bluebird');
var?url?=?'http://www.xianlaiwan.cn/learn/';
var?courseId?=[56,?38,?637,?348,?259,?197,?134,?75];
function?filterChapters(html){
var?$?=?cheerio.load(html);
/*
//數組
[{
chapterTitle:'',
videos:[
title:'',
id:''
]
}]*/
/*
//對象
courseData?=?{
title:title,
number:number,
videos:[{
chapterTitle:title,
videos:[
title:'',
id:''
]
}]
}*/
var?chapters?=?$('.chapter');
var?title?=?$('#main?.hd?h2').text();
var?number?=?$('#main?.static-item?span.js-learn-num').text();
var?courseData?=?{
title:title,
number:number,
videos?:?[]
};
chapters.each(function(){
var?chapterTitle?=?$(this).find('strong').not('strong?div').text().trim(); //如何去掉
var?videos?=?$(this).find('ul').children('li');
var?chapterData?=?{
chapterTitle:?chapterTitle,
videos:[]
}
videos.each(function(){ //item?used?as?this
var?videoTitle?=?$(this).find('a').text().trim();
var?videoId?=?$(this).attr('data-media-id');
chapterData.videos.push({
title:videoTitle,
id:videoId
})
});
//?courseData.push(chapterData); //courseData是對象,沒有push方法
courseData.videos.push(chapterData);
});
return?courseData;
}
function?printCourseInfo(coursesData){
coursesData.forEach(function(courseData){
console.log(courseData.number?+?'?人學過?'?+?courseData.title?+?'\n');
var?str?=?'';
courseData.videos.forEach(function(item){
str?+=?item.chapterTitle?+'\n';
item.videos.forEach(function(item){
str?+=?'【'+item.id+'】'+?item.title?+'\n'
})
})
console.log(str);
})
}
function?getPageSync(url){
return?new?Promise(function(resolve,?reject){ //er1:promise是對象
console.log('正在爬取'?+?url);
http.get(url,function(res){
var?html?=?'';
res.on('data',function(data){
html?+=?data;
})
res.on('end',function(){
resolve(html); //成功后返回傳遞html
//?var?courseData?=?filterChapters(html);
})
}).on('error',function(e){
reject(e);
console.log('獲取課程數據失敗');
})
})
}
var?fetchCourseArray?=?[]; //Promise對象的數組
courseId.forEach(function(id){
fetchCourseArray.push(getPageSync(?url?+?id)); //組合地址
})
Promise
.all(fetchCourseArray) //接收一個數組,數組里面是一個一個Promise
.then(function(pages){ //pages拿到傳遞下來的結果
var?coursesData?=?[];
pages.forEach(function(html){
var?courses?=?filterChapters(html);
coursesData.push(courses);
})
coursesData.sort(function(a,b){ //返回正數,則a應該位于b后面
return?a.number?<?b.number; //由大到小的順序
})
printCourseInfo(coursesData);
})