您的位置:首页 > Web前端 > Node.js

Node.js实现单页面爬虫

2016-07-22 22:48 585 查看
在imooc网上跟着老师写了两个爬虫,一个最简单的直接爬整个页面,一个完善版把章节标题和对应编号打出来了。
看完之后,自己也想写一个爬虫,用自己的博客做测试,虽然结果并没有很成功- -,还是把代码放上来。
目标是抓取章节的标题。

博客页面:




对应标签:




页面源代码:




经过分析,我们应该要抓取class=artHead的<div>,往下还有一个没有类的<div>,然后找到它的<h3>标签下子标签<a>的内容,就是章节的名字。

上代码:
//引入http模块
var http = require('http');

//确定要抓取的页面
//debug:本来写了qmkkd.blog.51cto.com,一直出错,在前面加上http就好了。
var url = '';//这里的url是'http://qmkkd.blog.51cto.com';,博客显示不出来,有毒

//引入cherrio模块,类似服务器端的jquery
var cheerio=require('cheerio');

function filterChapters(html){

//将html变成jquery对象
var $ = cheerio.load(html);

var artHeads = $('.artHead');

var blogData=[];

artHeads.each(function(item){
var artHead = $(this);

//获取文章标题
var artTitle = artHead.find('h3').children('a').text();
blogData.push(artTitle);
})
return blogData;
}

function printBlogInfo(blogData){
blogData.forEach(function(item){
var artTitle = item;
console.log(item+'\n');
})
}

http.get(url,function(res){

var buffers=[];
var nread = 0;

res.on('data',function(data){
buffers.push(data);
nread+=data.length;
});

//网上找到的处理中文乱码问题的方法,但好像没有解决T_T
//之后还采用了bufferhelper类,好像也不对=-=
//应该是基础不好的问题,暂时debug不了,先放着
res.on('end',function(){
var buffer =null;
switch(buffers.length){
case 0:buffer=new Buffer(0);
break;
case 1:buffer=buffers[0];
break;
default:
buffer = new Buffer(nread);
for(var i=0,pos=0,l=buffers.length;i<l;i++){
var chunk = buffers[i];
chunk.copy(buffer,pos);
pos+=chunk.length;
}
break;
}
var html=buffer.toString();

var blogData = filterChapters(html);
printBlogInfo(blogData);
})
}).on('error',function(){   //执行http请求失败时,返回错误信息
console.log('获取博客数据出错');
})


本文出自 “Sunny” 博客,请务必保留此出处http://qmkkd.blog.51cto.com/9511687/1828974
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: