Node.js 实现爬虫(3) —— 保存爬取的数据

来源:互联网 发布:linux obj 编辑:程序博客网 时间:2024/06/07 04:03

保存爬取的数据

前面,我们已经写了爬虫程序并在控制台输出,但是,有时爬取的数据量过大,控制台查看不方便,所以,我们可以将数据保存到文件

//引入文件模块var fs = require("fs") //保存文件fs.writeFile(filename,fileStr,function (err) {    if (err) throw err     console.log("File Saved !")}) 

fs.writeFile(filename,fileStr,callback)

  • 当filename不存在时,会新建文件;否则,重新写文件
  • filename可以是相对路径,也可以是绝对路径

下面,将之前的多页面的程序中添加保存文件的功能
完整的程序如下:

var fs = require("fs") ;var http = require('http')var cheerio = require('cheerio')var Promise = require('bluebird')var url = 'http://blog.csdn.net/ranking.html'//过滤排行榜页面中“博客周排行”模块的urlfunction filterRankUrl(html){    var $ = cheerio.load(html)     //加载html内容    var blogRank = $('.rankList .ranking').eq(1).find('li')    var blogRankUrl = []    blogRank.each(function(item){        var blogRankItem = $(this)        var url = blogRankItem.find('a.blog_a').attr('href')        blogRankUrl.push(url)    })    return blogRankUrl}//过滤每个URL数组对应页面的文章function filterArticle(html){    var $ = cheerio.load(html)    var blogData = {}    //获取博主    var author = $('#panel_Profile .user_name').text()    blogData.author = author    //获取文章信息    var blogAtricle = $('.list_item_new .list_item')    var blogs = []    blogAtricle.each(function(item){        var blogItem = $(this)        var blogItemData = {}        var title = blogItem.find('.link_title').text().trim()        var description = blogItem.find('.article_description').text().trim()        var time = blogItem.find('.article_manage .link_postdate').text().trim()        var view = blogItem.find('.article_manage .link_view').text().trim()        var comments = blogItem.find('.article_manage .link_comments').text().trim()        blogItemData.title = title        blogItemData.description = description        blogItemData.time = time        blogItemData.view = view        blogItemData.comments = comments        blogs.push(blogItemData)    })    blogData.blogs = blogs    return blogData}//打印url数组function printUrlInfo(blogRankData){    blogRankData.forEach(function(item){        console.log(item)    })}//打印每个页面的信息function printArticleInfo(blogData){    var fileStr = ""    fileStr+="----博主 :  "+blogData.author+"----\n"    fileStr+="爬取文章数 :  "+blogData.blogs.length+"\n"    blogData.blogs.forEach(function(item){        fileStr+="文章名:"+item.title+'\n'        fileStr+="文章描述:"+item.description+'\n'        fileStr+="发表时间:"+item.time+'\n'        fileStr+=item.view+'\n'        fileStr+=item.comments+'\n'        fileStr+="\n--------------------\n\n"    })    return fileStr}function getUrlAsync(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(html)            })        }).on('error',function(){            reject(e)            console.log('获取数据出错')        })    })}http.get(url,function(res){    var html = ''    res.on('data',function(data){        html+=data    })    res.on('end',function(){        var urlArr = filterRankUrl(html)        //获取url        printUrlInfo(urlArr)        var fetchBlogArray = []        urlArr.forEach(function(url){            fetchBlogArray.push(getUrlAsync(url))        })        //执行promise        Promise            .all(fetchBlogArray)            .then(function(pages){                var fileStr=""                pages.forEach(function(html){                    var blogData = filterArticle(html)                    fileStr += printArticleInfo(blogData)                })                //写入文件                fs.writeFile("bb1.doc",fileStr,function (err) {                    if (err) throw err ;                    console.log("File Saved !"); //文件被保存                })             })    })}).on('error',function(){    console.log('获取数据出错');})

控制台输出如下:
这里写图片描述

保存文件如下:
这里写图片描述

阅读全文
0 0