初衷
非常喜歡知乎日報上面的內(nèi)容,另外又想用NodeJS來實現(xiàn)一個簡單的爬蟲練練手,so,對不住知乎了。(胡扯。。。。。。)
技術(shù)點
沒什么難的東西,非要說一個,那就是 cheerio,參考鏈接。如果對WEB前端開發(fā)很熟的話,?你很快就能上手這個庫,因為它的用法和jQuery極其相似。
旅程開始
-
使用 NPM 建立??我們的爬蟲工程
npm init ZHSpider填寫必要的信息后工程生成成功。
創(chuàng)建
data目錄,用以存放爬蟲爬下來的的內(nèi)容。創(chuàng)建工程入口文件
app.js,需要和創(chuàng)建工程時填寫的入口文件一致。-
安裝依賴。
npm install --save cheerio -
寫爬蟲邏輯
上代碼:
var http =require('http');
var cheerio = require('cheerio');
var fs = require('fs');
//需要爬的頁面
var url = 'http://daily.zhihu.com';
function fetchPage(url){
startRequest(url);
}
//獲取故事標題、內(nèi)容鏈接和圖片鏈接
function startRequest(url){
http.get(url, function(res){
var html = "";
var storys = [];
res.setEncoding('utf-8');
res.on('data', function(chunk){
html += chunk;
});
//1. 現(xiàn)將列表爬下來,列表包含每一個故事的標題、詳細內(nèi)容的鏈接等
res.on('end', function(){
var $ = cheerio.load(html);
$('.main-content-wrap .row .col-lg-4').each(function(index, item){
var wraps = $(item).children();
wraps.each(function(index, box){
var item_box = $(box).find('a');
var story = {};
story.title = item_box.text();
story.link = url + item_box.attr('href');
story.img = item_box.find('img').attr('src');
var length = storys.length;
story.index = length;
storys[length] = story;
});
});
//2. 遍歷列表,獲取詳細內(nèi)容
storys.forEach(function(item) {
fetchStoryContent(item.link, function(content, author){
item.content = content;
item.author = author;
//3. 將內(nèi)容存儲到本地文件
fs.appendFile('./data/' + item.title, item.content, 'utf-8', function(error){
if (error) {
console.log(error);
}
});
});
}, this);
});
});
}
//獲取故事內(nèi)容
function fetchStoryContent(url, callbackFunc){
var html = "";
http.get(url, function(res){
res.on('data', function(chunk){
html += chunk;
});
res.on('end', function(){
$ = cheerio.load(html);
var title = $('title').text();
var author = $('span.author').text();
var contentDom = $('.answer .content');
var content = "";
contentDom.each(function(index, item){
var text = $(this).text();
content += text;
});
//console.log(author);
callbackFunc(content, author);
});
});
}
//開始請求
fetchPage(url);
OK,到此,一個簡單的額爬蟲就完成了。這是一個非常簡單的版本,還有許多的東西等待優(yōu)化。運行一下,看看效果怎么樣。
-
運行
node app.js
運行結(jié)果:

運行結(jié)果