Node.js(十三)——Promise重构爬虫代码-创新互联-成都快上网建站

Node.js(十三)——Promise重构爬虫代码-创新互联

在重构代码之前,先要了解下什么是https?

成都创新互联是专业的阳西网站建设公司,阳西接单;提供网站设计、成都网站制作,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行阳西网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!

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)
})

运行结果如下:

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

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


分享标题:Node.js(十三)——Promise重构爬虫代码-创新互联
浏览路径:http://kswjz.com/article/hppjd.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流