Node.js 实现爬虫(1) —— 简单的爬虫程序

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

一个简单的爬虫程序

之前,每每听说爬虫,都说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

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

AES 加密解密 (javascript, java,php,c#)

2021-8-18 16:36:11

安全技术

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

2022-1-11 12:36:11

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