初衷
非常喜欢知乎日报上面的内容,另外又想用NodeJS来实现一个简单的爬虫练练手,so,对不住知乎了。(胡扯。。。。。。)
技术点
没什么难的东西,非要说一个,那就是 cheerio
,参考链接。如果对WEB前端开发很熟的话,�你很快就能上手这个库,因为它的用法和jQuery极其相似。
旅程开始
-
使用 NPM 建立��我们的爬虫工程
npm init ZHSpider
填写必要的信息后工程生成成功。
创建
data
目录,用以存放爬虫爬下来的的内容。创建工程入口文件
app.js
,需要和创建工程时填写的入口文件一致。-
安装依赖。
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);
}
//获取故事标题、内容链接和图片链接
function startRequest(url){
http.get(url, function(res){
var html = "";
var storys = [];
res.setEncoding('utf-8');
res.on('data', function(chunk){
html += chunk;
});
//1. 现将列表爬下来,列表包含每一个故事的标题、详细内容的链接等
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. 遍历列表,获取详细内容
storys.forEach(function(item) {
fetchStoryContent(item.link, function(content, author){
item.content = content;
item.author = author;
//3. 将内容存储到本地文件
fs.appendFile('./data/' + item.title, item.content, 'utf-8', function(error){
if (error) {
console.log(error);
}
});
});
}, this);
});
});
}
//获取故事内容
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,到此,一个简单的额爬虫就完成了。这是一个非常简单的版本,还有许多的东西等待优化。运行一下,看看效果怎么样。
-
运行
node app.js
运行结果: