Node.js学习一:简单爬虫

    node.js是一个基于Chrome JavaScript运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js使用事件驱动, 非阻塞I/O模型而得以轻量和高效,非常适合在分布式设备上运行数据密集型的实时应用。

Node.js

为什么要学习Node.js

  1. 很火

  2. 很强

优点

  1. Node.js使用了一个事件驱动、非阻塞式I/O的模型,轻量又高效。

  2. 采用事件驱动、异步编程,为网络服务而设计

  3. Node.js非阻塞模式的IO处理给Node.js带来在相对低系统资源耗用下的高性能与出众的负载能力,非常适合用作依赖其它IO资源的中间层服务

  4. Node.js轻量高效,可以认为是数据密集型分布式部署环境下的实时应用系统的完美解决方案

  5. 数据密集型分布式部署环境下的实时应用系统的完美解决方案。

应用

  1. JSON API 构建一个Rest/JSON API服务,Node.js可以充分发挥其非阻塞IO模型以及JavaScriptJSON的功能支持(如JSON.stringfy函数)

  2. 单页面、多Ajax请求应用 请求频繁的接口,前端有大量的异步请求,需要服务后端有极高的响应速度

  3. 基于Node.js开发Unix命令行工具 Node.js可以大量生产子进程,并以流的方式输出,这使得它非常适合做Unix命令行工具

  4. 流式数据 传统的Web应用,通常会将HTTP请求和响应看成是原子事件。而Node.js会充分利用流式数据这个特点,构建非常酷的应用。如实时文件上传系统transloadit

  5. …..

简单爬虫

代码

    下面这段代码爬取的是我一个朋友的博客首页数据,然后组装成数据并保存在本地txt文件中。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146

// 引入扩展库

var http    = require('http')

var cheerio = require('cheerio')

var fs 		= require('fs')

// 设置爬取的URL

var url     = 'http://zqiqi.cn/'



/**

 * 用于输出数据

 */

function out(data) {

	console.log(data)

}



/**

 * 获取到的html数据进行封装

 * @param  string html 

 * @return array  

 */

function filterChapters(html) {

	var $ = cheerio.load(html)

	var chapters   = $('.article')

	var courseData = []



	chapters.find('.border').each(function(item) {

		var chap = $(this)

		var title   = chap.find(' section h1').text()

		var time    = chap.find('.tips .con-time').text()

		var content = chap.find('.box-content .content').text()

		var data    = {

			title: title,

			time:time,

			content:content

		}

		courseData.push(data)

	});

	return courseData

}



/**

 * 组装打印数据	并保存在本地

 * @param  array data 

 */

function printCourseInfo(data) {

	var date = new Date()

	var save_msg = ''

	var dateNowDay = date.getFullYear() + '-' + (date.getMonth() +1) + '-' + date.getDate();

	// out(dateNowDay);

	data.forEach(function(item) {

		var title   = item.title

		var time    = item.time

		var content = item.content

		var msg = '   【' + title + '】\n'+ time + '\n'+ content +'\n'

		save_msg += msg

	})

	out(save_msg)

	fs.writeFile('test_'+dateNowDay +'.txt', save_msg)

}



http.get(url, function(res) {

	var html = ''

	res.on('data',function(data) {

		html += data

	})

	res.on('end', function () {

		// html数据进行处理

		var courseData = filterChapters(html)

		// 对数据进行处理

		printCourseInfo(courseData);

	})

}).on('error', function() {

	console.log('抓取失败');

})

运行

    命令行 输入node ****.js

运行结果.jpg

总结

    从直觉上来说,Node.js可以作为后端的第二个语言来学习,可以进行数据的异步操作,处理高并发API应该会是个不错的助力。

    上面这段简单的爬虫代码其实也可以稍微扩展下,做到可以爬取到具体的文章内容。

参考文档

  1. [Node.js 百度百科][2]

  2. [使用 Node.js 的优势和劣势都有哪些?][3]

  3. [进击Node.js基础][4]