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

释放双眼,带上耳机,听听看~!

保存爬取的数据

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


1
2
3
4
5
6
7
8
9
1//引入文件模块
2var fs = require("fs")
3
4//保存文件
5fs.writeFile(filename,fileStr,function (err) {
6    if (err) throw err
7    console.log("File Saved !")
8})
9

fs.writeFile(filename,fileStr,callback)

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

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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
1var fs = require("fs") ;
2var http = require('http')
3var cheerio = require('cheerio')
4var Promise = require('bluebird')
5var url = 'http://blog.csdn.net/ranking.html'
6
7//过滤排行榜页面中“博客周排行”模块的url
8function filterRankUrl(html){
9    var $ = cheerio.load(html)     //加载html内容
10
11    var blogRank = $('.rankList .ranking').eq(1).find('li')
12    var blogRankUrl = []
13
14    blogRank.each(function(item){
15        var blogRankItem = $(this)
16        var url = blogRankItem.find('a.blog_a').attr('href')
17        blogRankUrl.push(url)
18    })
19    return blogRankUrl
20}
21
22//过滤每个URL数组对应页面的文章
23function filterArticle(html){
24
25    var $ = cheerio.load(html)
26    var blogData = {}
27    //获取博主
28    var author = $('#panel_Profile .user_name').text()
29    blogData.author = author
30
31    //获取文章信息
32    var blogAtricle = $('.list_item_new .list_item')
33    var blogs = []
34    blogAtricle.each(function(item){
35        var blogItem = $(this)
36        var blogItemData = {}
37        var title = blogItem.find('.link_title').text().trim()
38        var description = blogItem.find('.article_description').text().trim()
39        var time = blogItem.find('.article_manage .link_postdate').text().trim()
40        var view = blogItem.find('.article_manage .link_view').text().trim()
41        var comments = blogItem.find('.article_manage .link_comments').text().trim()
42        blogItemData.title = title
43        blogItemData.description = description
44        blogItemData.time = time
45        blogItemData.view = view
46        blogItemData.comments = comments
47
48        blogs.push(blogItemData)
49    })
50    blogData.blogs = blogs
51    return blogData
52
53}
54
55//打印url数组
56function printUrlInfo(blogRankData){
57    blogRankData.forEach(function(item){
58        console.log(item)
59    })
60}
61
62//打印每个页面的信息
63function printArticleInfo(blogData){
64    var fileStr = ""
65    fileStr+="----博主 :  "+blogData.author+"----\n"
66    fileStr+="爬取文章数 :  "+blogData.blogs.length+"\n"
67    blogData.blogs.forEach(function(item){
68        fileStr+="文章名:"+item.title+'\n'
69        fileStr+="文章描述:"+item.description+'\n'
70        fileStr+="发表时间:"+item.time+'\n'
71        fileStr+=item.view+'\n'
72        fileStr+=item.comments+'\n'
73        fileStr+="\n--------------------\n\n"
74    })
75    return fileStr
76}
77
78function getUrlAsync(url){
79    return new Promise(function(resolve,reject){
80        console.log('正在爬取:'+url)
81        http.get(url,function(res){
82            var html = ''
83            res.on('data',function(data){
84                html+=data
85            })
86
87            res.on('end',function(){
88                resolve(html)
89            })
90        }).on('error',function(){
91            reject(e)
92            console.log('获取数据出错')
93        })
94    })
95}
96
97http.get(url,function(res){
98    var html = ''
99
100    res.on('data',function(data){
101        html+=data
102    })
103
104    res.on('end',function(){
105        var urlArr = filterRankUrl(html)        //获取url
106        printUrlInfo(urlArr)
107
108        var fetchBlogArray = []
109
110        urlArr.forEach(function(url){
111            fetchBlogArray.push(getUrlAsync(url))
112        })
113
114        //执行promise
115        Promise
116            .all(fetchBlogArray)
117            .then(function(pages){
118                var fileStr=""
119                pages.forEach(function(html){
120                    var blogData = filterArticle(html)
121                    fileStr += printArticleInfo(blogData)
122
123                })
124                //写入文件
125                fs.writeFile("bb1.doc",fileStr,function (err) {
126                    if (err) throw err ;
127                    console.log("File Saved !"); //文件被保存
128                })
129            })
130    })
131}).on('error',function(){
132    console.log('获取数据出错');
133})
134

控制台输出如下:

保存文件如下:

给TA打赏
共{{data.count}}人
人已打赏
安全技术

DES 加密 解密

2021-8-18 16:36:11

安全技术

C++ 高性能服务器网络框架设计细节

2022-1-11 12:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索