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

只输出正在爬取xxx页面,实际没拿到数据怎么回事儿,哪里错了?

var http = require('http');

var Promise = require('bluebird');

var cheerio = require('cheerio');

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

var videoIds=[259,197];


/*解析html,提取课程有用信息*/

function filterChapers(html){

var $ = cheerio.load(html);//把html内容装载进来

var chapters = $('.chapter');//通过类名拿到所有的章节

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

    var number = parseInt($($('.meta-value strong')[3]).text().trim(), 10)

console.log('title: '+title);   

/*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(); //这一章的名字,如 第一章:前言

console.log(chapterTitle)

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];//拿到当前小节即这小节视频的id


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');

})

})

})

}


// 异步爬取页面html

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(){

console.log('爬取' + url + '成功');

resolve(html);//通过resolve传递下去

})


}).on('error',function(){

reject(e);//爬虫在爬的时候出错了,返回一个错误信息

console.log('爬取失败');

})

})

}


// 爬取到的html页面集合

var fetchCourseArray = [];


// 批量爬取课程页面

videoIds.forEach(function(id){

fetchCourseArray.push(getPageAsync(baseUrl+id));

})


/*

all里面是一个个的promise对象

*/

Promise

.all([fetchCourseArray])

.then(function(pages){

var coursesData = [];


pages.forEach(function(html){

// 提取课程信息

var courses = filterChapers(html);

coursesData.push(courses);

})


coursesData.sort(function(a,b){

return a.number < b.number;//从大到小排序

})

// 打印课程信息

printCourseInfo(coursesData);

})





正在回答

1 回答


/*
all里面是一个个的promise对象
*/
Promise
.all([fetchCourseArray])    //<------这里不应该有中括号


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

陌上09 提问者

谢谢,我找到了
2016-08-27 回复 有任何疑惑可以回复我~

举报

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

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

进入课程

只输出正在爬取xxx页面,实际没拿到数据怎么回事儿,哪里错了?

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