文章概要
使用nodejs + cheerio 對極客學(xué)院的nodejs課程數(shù)據(jù)進(jìn)行爬取。統(tǒng)計nodejs系列課程學(xué)習(xí)總?cè)藬?shù),并記錄每個課程的課程名啥么、課程介紹往枷、鏈接地址框产、學(xué)習(xí)人數(shù)。
關(guān)于cheerio的使用错洁,請參考我的另外一篇文章 《cheerio 使用初步》
準(zhǔn)備
- 對應(yīng)的DOM結(jié)構(gòu)如下
-
我希望的到的是如下
課程名稱: Node.js 異步優(yōu)化 課程介紹:本課程作為 Node.js 進(jìn)階提升系列的第一課秉宿,主要講解 Node.js 的異步代碼編程習(xí)慣以及異步代碼編程會帶來的潛在問題。通過本課程的學(xué)習(xí)屯碴,學(xué)員將學(xué)會如何將 Node.js 的異步代碼進(jìn)行改良優(yōu)化描睦。 課程鏈接:4510人學(xué)習(xí) 學(xué)習(xí)人數(shù):http://www.jikexueyuan.com/course/2052.html
代碼 crawler.js
var http = require('http');
var cheerio = require('cheerio');
var fs = require('fs')
var url = 'http://www.jikexueyuan.com/course/nodejs/';// 要爬取的網(wǎng)址
function filterHtml(html){
var $ = cheerio.load(html);
var lesson_list = $('.lesson-list').find('ul').children('li');//nodejs 類型下所有課程
//預(yù)期想抓取的每個課程結(jié)構(gòu)
/*[{
lesson_name: '',
lesson_desc:'',
lesson_num:'',
lesson_href:''
}]*/
var nodeData = {
lessonersNum:0,
dataArray:[]
};
var lessonersTotalNum = 0;
lesson_list.each(function(item) {
var lesson = $(this); //獲得每個課程li
var lesson_box = lesson.find('.lessonimg-box');
var lesson_href = $(lesson_box.find('a')[0]).attr('href');//課程鏈接
var lesson_infor = lesson.find('.lesson-infor');//課程詳情
var lesson_name = $(lesson_infor.find('.lesson-info-h2').find('a')[0]).text();//課程名
var lesson_desc = lesson_infor.find('p').text().trim();//課程介紹
var lesson_num = lesson_infor.find('.timeandicon').find('.learn-number').text();
lessonersTotalNum += parseInt(lesson_num);
var lessonData = {
lesson_name: lesson_name,
lesson_desc:lesson_desc,
lesson_num:lesson_num,
lesson_href:lesson_href
}
nodeData.dataArray.push(lessonData)
})
nodeData.lessonersNum = lessonersTotalNum;
return nodeData;
}
function printInfo(info, course) {
var desStr = course + '系列共有: ' + info.dataArray.length + '門課程,總學(xué)習(xí)人數(shù):' + info.lessonersNum +'\r\n'
console.log(desStr);
fs.writeFileSync('./output.txt',desStr, {flag:'a'})
console.log('********** 具體信息如下 **********'+ '\r\n');
info.dataArray.forEach(function(item){
var itemDesc = '課程名稱: ' + item.lesson_name + '\r\n' +
'課程介紹:' + item.lesson_desc + '\r\n' +
'課程鏈接:' + item.lesson_num + '\r\n' +
'學(xué)習(xí)人數(shù):' + item.lesson_href + '\r\n\r\n';
console.log(itemDesc);
fs.writeFileSync('./output.txt',itemDesc, {flag:'a'})
})
}
http.get(url, function(res){
var html = '';
res.on('data', function(data) {
html += data;
})
res.on('end', function(){
var output = filterHtml(html);
printInfo(output, 'nodejs')
})
}).on('error', function() {
console.log('出錯了')
})
拉出啦溜溜
執(zhí)行
npm install --save cheerio
node crawler.js
可以看到輸出了一個文檔output.txt同時控制臺也有相應(yīng)的內(nèi)容。這篇文章只是練練手导而,下篇文章中忱叭,我會將代碼中的回調(diào)寫法改成Promise方式,同時今艺,并發(fā)的請求其他課程的內(nèi)容韵丑,然后對Promise語法,bluebird的使用進(jìn)行展開虚缎,然后分享一些收藏的文章埂息,敬請期待吧~