
今天要寫的是一個最簡單的爬蟲。
##目標:
理工新聞欄目--下面的所有文章,抓取到,並且儲存起來,今天是用檔案的形式儲存下來的,也可以直接存到資料庫裡。

1.node.js環境(包括npm)
2.你平時喜歡的編輯器(atom,idea,sublime...)
好了,現在可以幹活了。建好你的檔案目錄吧。

--images 儲存文章中的圖片
--node_modules node依賴
--app.js 主檔案
下面上程式碼:
/**
* 一個簡單的node爬蟲程式。可以獲取http://www.cust.edu.cn
* 裡面的理工新聞欄目下的文章,標題和文章內容會以txt檔案
* 儲存到/data目錄下,文章中的圖片會儲存在/images目錄下。
*/
var http = require('http');
var cheerio = require('cheerio');
var fs = require('fs');
var request = require('request');
/**
* 抓取http://www.cust.edu.cn/的理工新聞
* @type
*/
var cust = {
/**
* 獲取url裡的資料
* @param {[type]} url [獲取url]
* @param {Function} callback [回撥函式]
* @return {[type]} [null]
*/
download : function(url, callback){
http.get(url, function(res){
var data = '';
res.setEncoding('utf-8');
res.on('data', function(chunk){
data += chunk;
});
res.on('end', function(){
callback(data);
});
res.on('error', function(err){
if(err) throw err;
callback(null);
});
});
},
/**
* 開始執行爬蟲
* @param {[type]} url [獲取url]
* @return {[type]} [null]
*/
getStart : function(url){
cust.download(url, function(d){
if(d){
var $ = cheerio.load(d);
var title = $('#main3 h3').text().trim();
var publishTime = $('#author').text().trim().split('|')[0].split(':')[1];
var content = $('#work p').text();
var img = $('#work img');
cust.saveImg($, img);
cust.saveContent(publishTime+content, title);
}
});
},
/**
* 儲存獲取到的內容
* @param {[type]} content [文章內容]
* @param {[type]} title [文章標題]
* @return {[type]} [null]
*/
saveContent : function(content, title){
fs.appendFile('./data/' + title + '.txt', content, 'utf-8', function(err){
if(err) throw err;
});
},
/**
* 儲存文章中的圖片
* @param {[type]} $ [cheerio物件]
* @param {[type]} img [圖片物件]
* @return {[type]} [null]
*/
saveImg : function($, img){
img.each(function(i, e){
var imgUrl = 'http://www.cust.edu.cn' + $(this).attr('src').substr(2);
var imgname = imgUrl.split('/')[6];
request.head(imgUrl, function(err, res, body){
if(err) throw err;
});
request(imgUrl).pipe(fs.createWriteStream('./images/'+imgname));
});
}
};
var baseUrl = 'http://www.cust.edu.cn/lgxw/';
var numStart = 21821;
var numEnd = 24250;
for(var i=numStart; i<=numEnd;i++){
cust.getStart(baseUrl+i+'.htm');
}
複製程式碼
最後的結果:
文章全儲存到這裡了。/data

圖片全在這裡。 /images

本文於2016-09-10 15:32:17釋出在麥曉傑的新浪微博