亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

可運行代碼(交流學習)

var?http?=?require('http');
var?Promise?=?require('bluebird');
var?cheerio?=?require('cheerio');
var?colors?=?require('colors');
var?baseUrl?=?'http://www.xianlaiwan.cn/learn/';
var?videoIds?=?[348,?259,?197,?134,?75];
var?url?=?'http://www.xianlaiwan.cn/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基礎(二)
  • 參與學習       76735    人
  • 解答問題       242    個

本教程帶你攻破 Nodejs,讓 JavaScript流暢運行在服務器端

進入課程

可運行代碼(交流學習)

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號