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