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

这是啥情况

http://img1.sycdn.imooc.com//59675c67000144fb04050143.jpg

为毛我的运行结果是这样的,没有下文了。源码如下:

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

function filterChapters(html) {
	var $ = cheerio.load(html)
	var chapters = $('.chapter')
	var title = $('#main .path a span').text()
	var number = parseInt($('.js-learn-num').text().trim(), 10)

	// 预期的整理过后的数据
	/*var courseData = {
		title: title,
		number: number,
		videos: [{
			chapterTitle: '',
			videos: [
				title: '',
				id: ''
			]
		}]
	}*/

	var courseData = {		
		title: title,
		number: number,
		videos: []
		
	}

	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.videos.push(chapterData)
	})
	return courseData
}

function printCourseInfo(courseData) {
	courseData.forEach(function (coursesData) {
		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() {
			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) {
			// 对拿到的html页面进行解析
			var courses = filterChapters(html)

			coursesData.push(courses)
		})

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

		printCourseInfo
	})
	


正在回答

3 回答

参考:http://www.imooc.com/qadetail/238634,

这里面的代码是可以运行的,记住 npm install 依赖插件

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

var baseUrl = 'http://www.imooc.com/learn/348',有点问题,

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

var number = parseInt($('.js-learn-num').text().trim(), 10),文档结构发生变化,里面已经不再是字符串了,不需要转化。

原理上改为var number = $('#main .statics .js-learn-num').text();但因为number为异步加载,所以获取不到

你那个printCourseInfo函数有问题,主要是courseData的单复数问题(coursesData还是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){
           var chapterTitle = item.chapterTitle;

           console.log(chapterTitle + '\n');

           item.videos.forEach(function(video) {
               console.log('【' + video.id + '】' + video.title + ']n');
           })
       })
   })
}

Promise里也有点小问题,改成如下:

Promise
   .all(fetchCourseArray)
   .then(function (pages) {
       // 对爬取到的信息进行加工处理
       var coursesData = [];

       pages.forEach(function (html) {
           // 对拿到的html页面进行解析
           var courses = filterChapters(html);

           coursesData.push(courses);
       })

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

       printCourseInfo(coursesData);
   })

整体代码如下(在你的基础上改的):

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

function filterChapters(html) {
   var $ = cheerio.load(html);
   var chapters = $('.chapter');
   var title = $('#main .path a span').text();
   var number = $('.js-learn-num').text();

   // 预期的整理过后的数据
   /*var courseData = {
       title: title,
       number: number,
       videos: [{
           chapterTitle: '',
           videos: [
               title: '',
               id: ''
           ]
       }]
   }*/

   var courseData={
       title: title,
       number: number,
       videos: []
   };

   chapters.each(function(item) {
       var chapter = $(this);
       var chapterTitle = chapter.find('strong').text().replace(/\s/g, "");
       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().replace(/\s/g, "");
           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){
           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 coursesData = [];

       pages.forEach(function (html) {
           // 对拿到的html页面进行解析
           var courses = filterChapters(html);

           coursesData.push(courses);
       })

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

       printCourseInfo(coursesData);
   })

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

潘达哒

node现在的版本已经不需要bluebird可以不用引进,不过程序是没问题啦
2017-08-11 回复 有任何疑惑可以回复我~
#2

潘达哒

正则去掉了所有的space空格棒棒哒
2017-08-11 回复 有任何疑惑可以回复我~

发源码阿,这个情况太多了不打印信息的话

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

举报

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

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

进入课程

这是啥情况

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