初衷
非常喜歡知乎日?qǐng)?bào)上面的內(nèi)容,另外又想用NodeJS來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的爬蟲練練手,so,對(duì)不住知乎了。(胡扯。。。。。。)
技術(shù)點(diǎn)
沒(méi)什么難的東西,非要說(shuō)一個(gè),那就是 cheerio,參考鏈接。如果對(duì)WEB前端開(kāi)發(fā)很熟的話,?你很快就能上手這個(gè)庫(kù),因?yàn)樗挠梅ê蚸Query極其相似。
旅程開(kāi)始
-
使用 NPM 建立??我們的爬蟲工程
npm init ZHSpider填寫必要的信息后工程生成成功。
創(chuàng)建
data目錄,用以存放爬蟲爬下來(lái)的的內(nèi)容。創(chuàng)建工程入口文件
app.js,需要和創(chuàng)建工程時(shí)填寫的入口文件一致。-
安裝依賴。
npm install --save cheerio -
寫爬蟲邏輯
上代碼:
var http =require('http');
var cheerio = require('cheerio');
var fs = require('fs');
//需要爬的頁(yè)面
var url = 'http://daily.zhihu.com';
function fetchPage(url){
startRequest(url);
}
//獲取故事標(biāo)題、內(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)將列表爬下來(lái),列表包含每一個(gè)故事的標(biāo)題、詳細(xì)內(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. 遍歷列表,獲取詳細(xì)內(nèi)容
storys.forEach(function(item) {
fetchStoryContent(item.link, function(content, author){
item.content = content;
item.author = author;
//3. 將內(nèi)容存儲(chǔ)到本地文件
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);
});
});
}
//開(kāi)始請(qǐng)求
fetchPage(url);
OK,到此,一個(gè)簡(jiǎn)單的額爬蟲就完成了。這是一個(gè)非常簡(jiǎn)單的版本,還有許多的東西等待優(yōu)化。運(yùn)行一下,看看效果怎么樣。
-
運(yùn)行
node app.js
運(yùn)行結(jié)果:

運(yùn)行結(jié)果