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

保存爬取的数据

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

//引入文件模块
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'

//过滤排行榜页面中“博客周排行”模块的url
function 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('获取数据出错');
})

控制台输出如下:
Node.js 实现爬虫(3) —— 保存爬取的数据_第1张图片

保存文件如下:
Node.js 实现爬虫(3) —— 保存爬取的数据_第2张图片

你可能感兴趣的:(node-js)