小小代碼,有點意思哈
var http = require('http')
var cheerio = require('cheerio')
var Promise = require('bluebird')
var baseUrl = 'http://www.xianlaiwan.cn/learn/'
var videoIds = [348,259,197,134,75]
function filterChapters(html) {
var $ = cheerio.load(html)
var chapters = $('.chapter')
var title = $('.course-infos .path span').text()
// var num =? parseInt($($('.meta-value strong')[3]).text().trim(), 10)
? ? ?var num = 0
// coursesData = {
// title: title,
// number: number,
// videos: [{
// chapterTitle : '',
// videos : [
// ? ? title: '',
// ? ? id: ''
// ]
// }]
// }
? ? var courseData = {
? ? video: [],
? ? num: num,
? ? title: title
? ? }
? ??
? ? chapters.each(function(item){
? ? var chapter = $(this)
? ? var chapterTitle = chapter.find('strong').text()
? ? var videos = chapter.find('.video').children('li')
? ? var chapterData = {
? ? chapterTitle: chapterTitle,
? ? 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.video.push(chapterData)
? ? })
? ? return courseData
}
function printCourseInfo(coursesData) {
? ? coursesData.forEach(function(courseData){
? ?
? ? console.log('------------------------------------------'+courseData.num + '人學過 '+ courseData.title +'------------------------------------------'+ '\n' )
? ?
? ? courseData.video.forEach(function(val) {
console.log('############# ' + (val.chapterTitle).replace(/(^\s*)|(\s*$)/g, "") + '############# ')
console.log("\n")
//? ? ? ? ? ? ? ?console.log('\t'+'【 id'+ (val.videos[0].id).replace(/(^\s*)|(\s*$)/g, "")+' 】'+((val.videos)[0].title).replace(/(^\s*)|(\s*$)/g, "") +'\n')
//? ? ? ? ? ? ? ?console.log("-----------------------------------------------------")
? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? val.videos.forEach(function(item){
? ? ? ? ? ? ? ? ? console.log('\t 【 id '+item.id+" 】? ?"+(item.title).replace(/(^\s*)|(\s*$)/g, ""))
? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? })
})
? ? })
}
function getPageAsync(url){
return new Promise(function(resolve, reject){
console.log('正在爬取'+url)
http.get(url, function(res){
var html = ''
res.on('data', function(data) {
html += data
})
res.on('end', function() {
resolve(html)
})?
}).on('error', function(e) {
reject(e)
console.log('獲取數據失敗');
})
})
}
var fetchCourseArray = []
videoIds.forEach(function(id){
fetchCourseArray.push(getPageAsync(baseUrl + id))
})
Promise
? .all(fetchCourseArray)?
? ? .then(function(pages){
? ? var coursesData = []
? ? pages.forEach(function(html){
? ? var course = filterChapters(html)
? ?
? ? coursesData.push(course)
? ? })
? ?
? ? coursesData.sort(function(a, b){
? ? return a.number < b.number
? ? })
? ?
? ? printCourseInfo(coursesData)
? ? })
2017-10-11
666