一个简单的爬虫程序
之前,每每听说爬虫,都说python,现今看到Node.js的爬虫,实在兴奋不已,博主准备花费一段时间来认真学习一下!
以下描述的爬虫程序是在单页面进行数据的爬取
Step1:确定要爬取的网页
我们今天要爬取的网页是:CSDN博客的排行榜
url:http://blog.csdn.net/ranking.html
实现功能:将排行榜页面加载到程序中,并打印出来
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 1var http = require('http')
2var url = 'http://blog.csdn.net/ranking.html'
3
4http.get(url,function(res){
5 var html = '';
6
7 res.on('data',function(data){
8 html+=data;
9 })
10
11 res.on('end',function(){
12 console.log(html);
13 })
14}).on('error',function(){
15 console.log('获取数据出错');
16})
17
Step2:分析网页结构,确定数据的结构
网页结构
在这里,我们需要爬取的数据时图中的红色框区域。
数据格式
从上图,提取网页的重要信息,我们可以定义数据格式:
1
2
3
4
5
6
7
8 1[{
2 rankTitle : rankTitle,
3 rankData :[{
4 rankNum : rankNum,
5 content : content
6 }]
7}]
8
为了方便操作网页元素,引入cheerio模块,改造上述程序如下。
实现功能:提取网页中的重要信息,并按照上述格式进行组合
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 1var http = require('http')
2var cheerio = require('cheerio')
3var url = 'http://blog.csdn.net/ranking.html'
4
5//提取信息并组合
6function filterRankInfo(html){
7
8 var $ = cheerio.load(html) //加载html内容
9 var blogRank = $('.rankList .ranking')
10 var blogRankData = []
11
12 blogRank.each(function(Typeitem){
13 var blogRankType = $(this)
14 var blogRankTypeData = {}
15 var typeTitle = blogRankType.find('.rank_t').text()
16 blogRankTypeData.typeTitle = typeTitle
17 var blogRankTypeItem = blogRankType.find('li')
18 var typeData = []
19 blogRankTypeItem.each(function(item){
20 var blogRankTypeItem = $(this)
21 var typeItemData = {}
22
23 var rankNum = parseInt(blogRankTypeItem.find('em').text())
24 var content1 = blogRankTypeItem.find('a.article_t').text()
25 var content2 = blogRankTypeItem.find('a.blog_a').text()
26 var content3 = blogRankTypeItem.find('a.star_name').text()
27
28 var content = content1?content1:(content2?content2:content3)
29
30 typeItemData.rankNum = rankNum
31 typeItemData.content = content
32
33 typeData.push(typeItemData)
34 })
35 blogRankTypeData.typeData = typeData
36 blogRankData.push(blogRankTypeData)
37
38 })
39 return blogRankData
40}
41
42//打印博客排行榜
43function printBlogRankInfo(blogRankData){
44 blogRankData.forEach(function(item){
45 console.log("\n\n--------"+item.typeTitle+'--------\n')
46 item.typeData.forEach(function(details){
47 console.log(details.rankNum + '\t' + details.content)
48 })
49 })
50}
51
52http.get(url,function(res){
53 var html = '';
54
55 res.on('data',function(data){
56 html+=data;
57 })
58
59 res.on('end',function(){
60 // console.log(html);
61 var blogRankData = filterRankInfo(html)
62 printBlogRankInfo(blogRankData)
63 })
64}).on('error',function(){
65 console.log('获取数据出错');
66})
67
运行结果截图
部分截图如下:
本文章参考慕课视频:http://www.imooc.com/learn/348