Node.js实现单页面爬虫

在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(‘获取博客数据出错‘);
})
时间: 2024-10-01 06:24:30

Node.js实现单页面爬虫的相关文章

node.js表单——formidable/////z

node.js表单——formidable node处理表单请求,需要用到formidable包.安装formidable包的命令如下: npm install formidable 安装package的路径分为两种,一种是本地目录,一种是全局目录. npm install xxx -g 命令将模块下载安装到全局目录中. 全局目录可以通过 npm config set prefix "目录路径" 来设置. 通过 npm config get prefix 来获取当前设置的目录. npm

node.js表单——formidable

node处理表单请求,需要用到formidable包.安装formidable包的命令如下: npm install formidable 安装package的路径分为两种,一种是本地目录,一种是全局目录. npm install xxx -g 命令将模块下载安装到全局目录中. 全局目录可以通过 npm config set prefix "目录路径" 来设置. 通过 npm config get prefix 来获取当前设置的目录. npm install xxx ,则是将模块下载到

使用Node.js作为后台进行爬虫

看了一遍又一遍Node.js但是没过多久就又忘了,总想找点东西来练练手,就发现B站首页搜索框旁边的GIF图特别有意思,想着是不是可以写一个小Node.js项目把这些图全部扒下来,于是带着复习.预习与探索的姿态就开始吧~ 步骤记录 爬取目标 B站首页右上角搜索框下面的GIF图片 初步流程图 初步流程图 一开始的想法很单纯,既然 每次刷新首页都会随机得到一张GIF动图,这些动图的url地址都没有规律可循,但我可以不断去请求首页URL并将目标图片的地址和标题扒下来,再次请求图片存在本地就好了,再考虑上

【Web API系列教材】1.3 — 实战:用ASP.NET Web API和Angular.js创建单页面应用程序(下)

练习2:创建SPA界面 在本练习中,你将首先创建Geek Quiz的web前端,使用AngularJS专注于单页面应用程序的交互.然后你将使用CSS3来执行丰富的动画和提供一个当从一个问题转换到另一个问题时切换上下文的可视化效果以加强用户体验. 任务1:使用AngularJS来创建SPA界面 在本任务中,你将使用AngularJS来实现Geek Quiz应用程序的客户端.AngularJS是一个开源的JavaScript框架,它能够搭配MVC以加强基于浏览器的应用程序,使其对于开发和测试都更加便

[js高手之路]Node.js实现简易的爬虫-抓取博客所有文章列表信息

抓取目标:就是我自己的博客:http://www.cnblogs.com/ghostwu/ 需要实现的功能: 抓取博客所有的文章标题,超链接,文章摘要,发布时间 需要用到的库: node.js自带的http库 第三方库:cheerio,这个库就是用来处理dom节点的,他的用法几乎跟jquery用法一模一样,所以有了这个利器,写一个爬虫就非常简单 准备工作: 1,npm init --yes 初始化package.json 2,安装cheerio:npm install cheerio --sav

Node.js之网络小爬虫

使用JavaScript在前端访问跨域页面常常用到Ajax,后端Node.js抓取网页信息就容易得多. 下面是一个最简单的例子,抓取我的博客主页信息,显示首页博客标题. 1 var http = require('http') 2 var cheerio = require('cheerio') 3 4 var url = 'http://www.cnblogs.com/feitan/' 5 6 function filterHtml(html) { //使用cheerio处理DOM 7 var

node.js简单的页面输出

在node.js基本上没有兼容问题(如果你不是从早期的node.js玩起来),而且原生对象又加了这么多扩展,再加上node.js自带的库,每个模块都提供了花样繁多的API,如果还嫌不够,github上还有上千个插件.对于想向尝试一下后端编程的JSer来说,这是极具诱惑力的.可能有人说,后端不是涉及数据库操作吗?这与比前端的DOM兼容比起来,不值一提.还有什么文件夹与文件操作 ,你就当成是一种特殊的数组操作就是.因此你完全可以愤愤不平! 好了,我们来点实质的内容吧.node.js本来就是一个htt

Node.js(九)——HTTP小爬虫

HTTP爬虫 网络上每时每刻都有海量的请求,有从客户端到服务器端的,也有服务器端到服务器端的 一般在浏览器里,我们是通过ajax来完成表单的提交或者是数据的获取, 那在http模块里呢get和request这两个接口来完成数据的获取或者是提交. 来个实例,爬一下51cto博客的数据 先从最简单的爬虫开始,爬源码 示例代码如下: var http = require('http') var url = 'http://mazongfei.blog.51cto.com/3174958/1909817

Node.js(十三)——Promise重构爬虫代码

在重构代码之前,先要了解下什么是https? https协议:基于ssl/tls的http协议,所有的数据都是在 ssl/tls协议的封装之上传输的,也就是说https协议是在http协议基础上 添加了ssl/tls握手以及数据加密传输,因此这就是两者之间最大的区别. https模块专门处理加密访问的,区别在于搭建https服务器的时候需要有ssl证书. 模拟搭建https服务器 var https = require('https') var fs = require('fs')//文件系统模