为了账号安全,请及时绑定邮箱和手机立即绑定

为什么结果只显示“正在爬取http://www.imooc.com/learn/id”*6 ?

结果:

正在爬取http://www.imooc.com/learn/637
正在爬取http://www.imooc.com/learn/348
正在爬取http://www.imooc.com/learn/259
正在爬取http://www.imooc.com/learn/197
正在爬取http://www.imooc.com/learn/134
正在爬取http://www.imooc.com/learn/75

代码:

var http = require('http')
var cheerio = require('cheerio')
var Promise = require('bluebird')
var baseUrl = 'http://www.imooc.com/learn/'

var videoIds = [637,348,259,197,134,75]
var fetchCourseArray = []
videoIds.forEach(function (id) {
    fetchCourseArray.push(getPageAsync(baseUrl + id))
})

Promise
    .all([])
    .then(function (pages) {
        var coursesData = []
        pages.forEach(function (html) {
            var courses = filterChapters(html)
            coursesData.push(courses)
        })

        coursesData.sort(function (a, b) {
            return a.number < b.number
        })

        printCourseInfo(coursesData)
    })

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('获取页面数据出错!')
        })
    })

}

function filterChapters(html) {
    var $ = cheerio.load(html)
    var chapters = $('.chapter')
    var title = $('.course-infos .hd .l').text()
    var number = parseInt($('.course-infos .statics .static-item')[3].children('.meta-value strong').text().trim(),10)
    var courseData = {
        title: title,
        number: number,
        videos: []
    }
    chapters.each(function (item) {
        var chapter = item
        var chapterTitle = chapter.find('strong').text()
        var videos = chapter.find('.video').children('li')
        var chapterData = {
            chapterTitle: chapterTitle,
            videos: []
        }
        videos.each(function (item) {
            var video = item.find('.studyvideo')
            var videoTitle = video.text()
            var id = video.attr('href').split('video/')[1]
            chapterData.videos.push({
                title: videoTitle,
                id: id
            })
        })
        courseData.videos.push(chapterData)
    })
    return courseData
}
function printCourseInfo(coursesData) {
    coursesData.forEach(function (courseData) {
        console.log(courseData.number + ' 人学过 ' + courseData.title + '\n')
    })

    coursesData.forEach(function (courseData) {
        console.log('### ' + courseData.title + '\n')
        courseData.videos.forEach(function (item) {
            console.log('### ' + item.title + '\n')
            var chapterTitle = courseData.chapterTitle
            console.log(chapterTitle + '\n')
            item.videos.forEach(function (video) {
                console.log(' 【' + video.id + '】' + video.title + '\n')
            })
        })
    })
}


正在回答

1 回答

修改:

var http = require('http')
var cheerio = require('cheerio')
var Promise = require('bluebird')
var baseUrl = 'http://www.imooc.com/learn/'
var videoIds = [637,348,259,197,134,75]

var fetchCourseArray = []
videoIds.forEach(function (id) {
    fetchCourseArray.push(getPageAsync(baseUrl + id))
})

Promise
    .all(fetchCourseArray)
    .then(function (pages) {
        var coursesData = []
        pages.forEach(function (html) {
            var courses = filterChapters(html)
            coursesData.push(courses)
        })

        coursesData.sort(function (a, b) {
            return a.number < b.number
        })

        printCourseInfo(coursesData)
    })

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('获取页面数据出错!')
        })
    })
}

function filterChapters(html) {
    var $ = cheerio.load(html)
    var chapters = $('.chapter')
    var title = $('.course-infos .hd .l').text()
    var number = parseInt($('.course-infos .statics .static-item:last-child').find('.meta-value strong').text().trim(),10)
    var courseData = {
        title: title,
        number: number,
        videos: []
    }
    chapters.each(function () {
        var chapter = $(this)
        var chapterTitle = chapter.find('strong').text()
        var videos = chapter.find('.video').children('li')
        var chapterData = {
            chapterTitle: chapterTitle,
            videos: []
        }
        videos.each(function () {
            var video = $(this).find('.studyvideo')
            var videoTitle = video.text()
            var id = video.attr('href').split('video/')[1]
            chapterData.videos.push({
                title: videoTitle,
                id: id
            })
        })
        courseData.videos.push(chapterData)
    })
    return courseData
}
function printCourseInfo(coursesData) {
    coursesData.forEach(function (courseData) {
        console.log(courseData.number + ' 人学过 ' + courseData.title + '\n')
    })
    coursesData.forEach(function (courseData,index) {
        console.log('课程' + (index+1) +': ' + courseData.title + '\n')
        courseData.videos.forEach(function (item) {
            var chapterTitle = item.chapterTitle
            console.log(chapterTitle + '\n')
            item.videos.forEach(function (video) {
                console.log(' 【' + video.id + '】' + video.title + '\n')
            })
        })
    })
}


0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
进击Node.js基础(二)
  • 参与学习       76755    人
  • 解答问题       226    个

本教程带你攻破 Nodejs,让 JavaScript流畅运行在服务器端

进入课程

为什么结果只显示“正在爬取http://www.imooc.com/learn/id”*6 ?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信