在重构代码之前,先要了解下什么是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:[]}//遍历videosvideos.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.chapterTitleitem.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)})
运行结果如下:
本文出自 “IT菜鸟” 博客,请务必保留此出处http://mazongfei.blog.51cto.com/3174958/1911261