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

可运行代码(交流学习)

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

console.log('正在启动程序');
console.log('.')
console.log('..')
console.log('.........')

function removeSpecialCharscter(words) {
  var reg = /\s+/g;
  return words.replace(reg, ' ');
}

function filterHtml(obj) {
  var $ = cheerio.load(obj.html);
  var courseId = obj.id;
  var courseTitle = $('#main .course-infos h2').text().trim();
  var chapters = $('.chapter');
   /*[
   chapterTitle: '',
   sessions:{
      chapterTitle: '',
      session: [{
        id: '',
        title: ''
      }]
  }]*/ 
  var courseData = [];
  
  //获取章
  chapters.each(function(item) {
    var chapter = $(this);
    var $chapterTitle = chapter.find('strong').clone();
    $chapterTitle.find('.chapter-info').remove();
    //章标题
    var chapterTitle = $chapterTitle.text();
    chapterTitle = removeSpecialCharscter(chapterTitle.trim());

    var chapterData = {
      chapterTitle: chapterTitle,
      sessions: []
    };   

    //获取节
    var sessions = chapter.find('.video li');
    sessions.each(function(item) {
      var session = $(this);
      var $a = session.find('a');
      var sessionTitle = removeSpecialCharscter($a.text().trim());
      var splitSessionTitle = sessionTitle.split('(');
      sessionTitle = splitSessionTitle[0];
      var id = $a.attr('href').split('/video/')[1];
      chapterData.sessions.push({
        id: id,
        title: sessionTitle
      });
    })

    courseData.push(chapterData);
  });
  courseData = {
    id: courseId,
    title: courseTitle,
    chapterData: courseData
  };
  return courseData;
}

function printCourseInfo(courseData) {
  var courseId = courseData.id;
  var courseTitle = courseData.title;
  console.log(('\n《' + courseTitle + '》 编号:' + courseId).green);

  var courses = courseData['chapterData'];

  courses.forEach(function(item) {
    var chapterTitle = item.chapterTitle;
    //输出章
    console.log(chapterTitle.red);
    var sessions = item.sessions;
    //输出节
    sessions.forEach(function(item) {
      console.log('  ' + item.title.yellow);
    })

  });
}

function getPageAsync(url, id) {
  return new Promise(function(resolve, reject) {
    http.get(url, function(res) {
      console.log('正在爬取:'+url)
      var html = '';

      res.on('data', function(data) {
        html += data;
      });

      res.on('end', function() {
        resolve({
          html: html,
          id: id
        });
        /*var courseData = filterHtml(html);
        pringCourseInfo(courseData);*/
      })
    }).on('error', function(e) {
      reject(e)
      console.log('获取网页代码出错!');
    })

  })
}

var fetchCourseArray = [];

videoIds.forEach(function(id) {
  fetchCourseArray.push(getPageAsync(baseUrl + id, id))
})

Promise
  .all(fetchCourseArray)
  .then(function(obj) {
    setTimeout(function() {
      var courseData = [];

      obj.forEach(function(item) {
        var course = filterHtml(item);
        courseData.push(course);
      })

      courseData.sort(function(a, b) {
        return a.id > b.id;
      })
      .forEach(function(course) {
        printCourseInfo(course);
      })

      // console.log('成功爬取页面!');
    }, 1000)
  })


正在回答

4 回答

没人人数获取吗?他们说ajax可行,我在代码中实例化xhr对象,结果构造器不存在,想来是node环境下没有这个,然后直接获取人数又是一个空值,脑阔疼!

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

   courseData.push(chapterData);

  });

  courseData = {

    id: courseId,

    title: courseTitle,

    chapterData: courseData

  };

  return courseData;

。。。你就不能规范点命名么~ = =!


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

炸猪排超人 提问者

驼峰式命名,并没有什么错哦~
2017-11-28 回复 有任何疑惑可以回复我~

很棒哦!!但是为什么要设个定时器

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

weibo_流浪的two子_0

http.get 也是异步的,所以很有可能当promise执行的时候,fetchCourseArray还是一个空数组呢吧。
2017-10-24 回复 有任何疑惑可以回复我~
#2

nc1199

promise的then方法执行过程是异步的,这样加个定时器,可能是想要在1秒后同时去爬取不同URL的页面内容把
2017-11-24 回复 有任何疑惑可以回复我~
#3

炸猪排超人 提问者 回复 nc1199

只是想有个缓冲
2017-11-28 回复 有任何疑惑可以回复我~

-_-!


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

举报

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

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

进入课程

可运行代码(交流学习)

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