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‘)//文件系统模块

var options = {
	//同步的读出ssl证书__虚拟
	key:fs.readFileSync(‘ssh_key.pem‘)
	cert:fs.readFileSync(‘ssh_cert.pem‘)
}
//通过以上读取证书之后就可以运行https服务器

https.createServer(options, function(req,res){
	res.wirteHead(200)
	res.end(‘Hello Https‘)
}).listen(8090)

重构爬虫代码:

var http = require(‘http‘)
var cheerio = require(‘cheerio‘)
//在新版本中Promise已经内置
var promise = require(‘bluebird‘)
var baseUrl = ‘http://www.imooc.com/learn/‘

var videoIds = [348,259,197,134,751]

function filterChapters(html){
	var $ = cheerio.load(html)
	var chapters = $(‘.mod-chapters‘)
	//标题
	var title = $(‘#main .path span‘).text()
	//学习的人数
	//var number = parseInt($($(‘static-item‘)[0]).text().trim(),10)
	//var number = $($(‘.static-item span‘)[1]).text();
	//var number = parseInt($(‘.meta-value js-learn-num‘).text().trim(),10)
	var number = $(‘.meta-value js-learn-num‘).html()
	var courseData = {
		title:title,
		number:number,
		videos:[]
	}
	//遍历的里面拿到数据
	chapters.each(function(item){
		var chapter = $(this);

		//章节标题
		var chapterTitle = chapter.find(‘strong‘).text()
		console.log(chapterTitle)
		var videos = chapter.find(‘.video‘).children(‘li‘)
		var chapterData = {
			chapterTitle:chapterTitle,
			videos:[]
		}

		//遍历videos
		videos.each(function(item){
			var video = $(this).find(‘.J-media-item‘)
			var videoTitle = video.text()
			var id = video.attr(‘href‘).split(‘video/‘)[1]

			chapterData.videos.push({
				title:videoTitle,
				id:id
			})
		})

		courseData.videos.push(chapterData)
	})

	return courseData
}

function printCourseInfo(coursesData){

	coursesData.forEach(function(courseData){
		console.log(courseData.number + ‘ 人学过 ‘+courseData.title+‘\n‘)
	})

	//数组中的遍历
	coursesData.forEach(function(courseData){
		console.log(‘### ‘+courseData.title+‘\n‘)
		courseData.videos.forEach(function(item){

		var chapterTitle = item.chapterTitle
		item.videos.forEach(function(video){
			console.log(‘【‘+video.id+‘】‘+video.title);
		})
	})
	})

}

function getPageAsync(url){
	return new Promise(function(resolve,reject){
		console.log(‘正在抓取‘ + url  )

		http.get(url, function(res){
		var html = ‘‘

		res.on(‘data‘,function(data){
			html += data
		})

		res.on(‘end‘,function(){
			//在请求完成的时候,通过resolve传递下去
			resolve(html)
		}).on(‘error‘,function(e){
			//如果出错了
			reject(e)
			console.log(‘获取页面出错‘)
		})
	})

	})
}

var fetchCourseArray = []

videoIds.forEach(function(id){
	//遍历的结果传递过去
	 fetchCourseArray.push(getPageAsync(baseUrl + id))
})

//需要做并发控制,全部去爬
Promise
	.all(fetchCourseArray)
	.then(function(pages){
	//多页面处理
	var coursesData = []
	//对page进行加工
	pages.forEach(function(html){
		//对html进行解析
		var courses = filterChapters(html)
		coursesData.push(courses)
	})

	//遍历
	coursesData.sort(function(a,b){
		return a.number < b.number
	})

	printCourseInfo(coursesData)
})

运行结果如下:

时间: 2024-10-08 19:26:00

Node.js(十三)——Promise重构爬虫代码的相关文章

Node.js的Connect框架的代码重写与改进

Node.js的Connect框架的代码重写与改进 Connect框架简介 Connect框架是建立在Node.js的基本http.server功能之上,帮助实现结构化的web服务器逻辑的框架.Connect框架建立在两个重要的设计模式之上. 1) 责任链模式 在处理web请求时常需要作分派处理.例如,ASP.NET MVC支持按照请求参数将处理分派至某个Controller类的某个Action方法,以及根据Action方法的返回结果类型分派不同的结果操作(如ViewResult.JsonRes

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

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

[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的Promise库-bluebird示例

前两天公司一哥们写了一段node.js代码发给我,后面特意提了一句“写的不太优雅”.我知道,他意思是回调嵌套回调,因为当时比较急也就没有再纠结.然而内心中总记得要解决这个问题.解决node.js的回调金字塔问题有较多方法,在<深入浅出node.js>这本书中介绍了好几种,有事件发布/订阅模式.Promise模式.async库等.其中Promise模式被很多人推崇,实现的库有很多,本着从众的原则,闭着眼睛选个bluebird吧. 然而bluebird的文档并不咋滴,相当不咋滴!网上的例子基本上都

Node.js之Promise维护(同步)多个回调(异步)状态

金天:学习一个新东西,就要持有拥抱的心态,如果固守在自己先前的概念体系,就会有举步维艰的感觉..NET程序员初用node.js最需要适应的就是异步开发, 全是异步,常规逻辑下遍历列表都是异步,如何保证列表遍历执行完毕?Promise帮你搞定!金天微信:15998603918 欢迎找我聊聊天. Node.js编程,清一色的回调. 如果没有Promise, 一连串的业务逻辑,从第一步回调到最后一步,“单线程逻辑”还搞的定,遭遇“多线程逻辑”,便陷入回调地狱. 自从有了Promise, 一切都不在是问

在Node.js使用Promise的方式操作Mysql

最近在学习Node.js,虽然早就听说了回调地狱结果过了一周就遇到了.所以花时间学习了了一下Promise.虽然还有Async/await.co.生成器等选择,但是因为本人基础较差,以及时间问题所以决定先用好Promise. 你可以选择用原生的,当然最好还是用BlueBird,听说性能比官方的好很多,而且有额外的特性:promisifyAll.Promisify 官方案例: var fs = Promise.promisifyAll(require("fs")); fs.readFil

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

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

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

when 让你跳出异步回调噩梦 node.js下promise/A规范的使用

其实关于promise 的博客,前端时间专门写了一篇关于 promise 规范的文章,promise规范 让 javascript 中的异步调用更加人性化. 简单回忆下: promise/A规范定义的“Deferred/Promise”模型 其实是实现了“发布/订阅”模型. 通过Deferred对象发布事件, 包括下面2种事件 完成 --> resolve事件, 失败 --> reject事件, 通过Promise对象进行对应完成或失败的订阅 类似于任务状态转变时事件被触发. 将会对应的执行事