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

除了学习人数获取不了,其他都没啥问题

var http = require('http')

var Promise = require('bluebird')

var cheerio = require('cheerio')

var baseUrl = 'http://www.imooc.com/learn/'

var videoIds = [935, 796, 694, 327]


function filterChapters(html){

var $ = cheerio.load(html)

var chapters = $('.chapter')

var title = $('.course-infos .path span').text().trim()

var number = ($('.js-learn-num').text() != '')?parseInt($('.js-learn-num').text().trim(),10):0

var courseData = {

title: title,

number: number,

videos: []

}

chapters.each(function(item){

var chapter = $(this)

var chapterTitle = chapter.find('strong').contents().filter(function() {

    return this.nodeType === 3;

}).text().trim()

chapterTitle = chapterTitle.replace(/<\/?[^>]*>/g,''); //去除HTML tag

chapterTitle = chapterTitle.replace(/[ | ]*\n/g,'\n'); //去除行尾空白

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.contents().filter(function() {

    return this.nodeType === 3;

}).text().trim()

videoTitle = videoTitle.replace(/<\/?[^>]*>/g,''); //去除HTML tag

videoTitle = videoTitle.replace(/[ | ]*\n/g,'\n'); //去除行尾空白

var id = video.attr('href').split('video/')[1]

chapterData.videos.push({

title: videoTitle,

id: id

})

})

courseData.videos.push(chapterData)

})

return courseData

}


function printCourseInfo(courseData){

courseData.forEach(function(courseData){

console.log(courseData.number + ' 人学过 '+ courseData.title + '\n')

})

courseData.forEach(function(courseData){

console.log('### '+ 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')

})

})

})

}


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 courseData = []

pages.forEach(function(html){

var courses = filterChapters(html)

courseData.push(courses)

})

courseData.sort(function(a,b){

return a.number < b.number

})

printCourseInfo(courseData)

})


正在回答

5 回答

实现了获取人数,源码:

https://niuyi1017.github.io/2018/09/10/http-crawler.html


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

可参考下我这个的,用chorme xhr看到的接口,人数要单独请求


...
var baseUrl = 'http://www.imooc.com/learn/'
var memberUrl = 'http://www.imooc.com/course/AjaxCourseMembers?ids='
var videoIds = [348, 259, 197, 134, 75]
...

function filterChapters(dto) {
  var html = dto.html
  var numbers = dto.numbers
  var $ = cheerio.load(html)
  var chapters = $('.chapter')
  var title = $('.course-infos .hd h2').text()
  var number = parseInt(numbers, 10)
  ...

function getPageAsync(url, memberUrl) {
  return new Promise(function(resolve, reject) {
    console.log('正在爬取 ' + url)
    var dto = {}
    http.get(memberUrl, function(res) {
      res.on('data', function (data) {
        dto.numbers = JSON.parse(data.toString()).data[0].numbers})
      res.on('end', function () {})
      }).on('error', function () {console.log('获取学习人数出错')})
    http.get(url, function(res) {
      var html = ''
      res.on('data', function (data) {dto.html += data})
      res.on('end', function () {resolve(dto)})
      }).on('error', function () {
        reject(e)
        console.log('获取课程数据出错')})
    })}
    ...
    
videoIds.forEach(function(id) {
  fetchCourseArray.push(getPageAsync(baseUrl + id, memberUrl + id))})

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


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

根据提示,查点资料,大致思路是,浏览器,F12看源码,可以找到取学习人数的连接,然后,http.get就可以得到人数数据,结果如下

http://img1.sycdn.imooc.com//5aadfa250001842703220193.jpg

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

同问,学习人数获取不到

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

我测试了一下可以获取啊,实在不行现在Chrome的调试面板里先试试

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

举报

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

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

进入课程

除了学习人数获取不了,其他都没啥问题

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