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

一个简单的爬虫程序

之前,每每听说爬虫,都说python,现今看到Node.js的爬虫,实在兴奋不已,博主准备花费一段时间来认真学习一下!

以下描述的爬虫程序是在单页面进行数据的爬取

Step1:确定要爬取的网页

我们今天要爬取的网页是:CSDN博客的排行榜
url:http://blog.csdn.net/ranking.html

实现功能:将排行榜页面加载到程序中,并打印出来

var http = require('http')
var url = 'http://blog.csdn.net/ranking.html'

http.get(url,function(res){
    var html = '';

    res.on('data',function(data){
        html+=data;
    })

    res.on('end',function(){
        console.log(html);
    })
}).on('error',function(){
    console.log('获取数据出错');
})

Step2:分析网页结构,确定数据的结构

网页结构
Node.js 实现爬虫(1) —— 简单的爬虫程序_第1张图片

在这里,我们需要爬取的数据时图中的红色框区域。

数据格式
从上图,提取网页的重要信息,我们可以定义数据格式:

[{
    rankTitle : rankTitle,
    rankData :[{
        rankNum : rankNum,
        content : content
    }]
}]

为了方便操作网页元素,引入cheerio模块,改造上述程序如下。

实现功能:提取网页中的重要信息,并按照上述格式进行组合

var http = require('http')
var cheerio = require('cheerio')
var url = 'http://blog.csdn.net/ranking.html'

//提取信息并组合
function filterRankInfo(html){

    var $ = cheerio.load(html)     //加载html内容
    var blogRank = $('.rankList .ranking')
    var blogRankData = []

    blogRank.each(function(Typeitem){
        var blogRankType = $(this)
        var blogRankTypeData = {}
        var typeTitle = blogRankType.find('.rank_t').text()
        blogRankTypeData.typeTitle = typeTitle
        var blogRankTypeItem = blogRankType.find('li')
        var typeData = []
        blogRankTypeItem.each(function(item){
            var blogRankTypeItem = $(this)
            var typeItemData = {}

            var rankNum = parseInt(blogRankTypeItem.find('em').text())
            var content1 = blogRankTypeItem.find('a.article_t').text()
            var content2 = blogRankTypeItem.find('a.blog_a').text()
            var content3 = blogRankTypeItem.find('a.star_name').text()

            var content = content1?content1:(content2?content2:content3)

            typeItemData.rankNum = rankNum
            typeItemData.content = content

            typeData.push(typeItemData)
        })
        blogRankTypeData.typeData = typeData
        blogRankData.push(blogRankTypeData)

    })
    return blogRankData
}

//打印博客排行榜
function printBlogRankInfo(blogRankData){
    blogRankData.forEach(function(item){
        console.log("\n\n--------"+item.typeTitle+'--------\n')
        item.typeData.forEach(function(details){
            console.log(details.rankNum + '\t' + details.content)
        })
    })
}

http.get(url,function(res){
    var html = '';

    res.on('data',function(data){
        html+=data;
    })

    res.on('end',function(){
    //  console.log(html);
        var blogRankData = filterRankInfo(html)
        printBlogRankInfo(blogRankData)
    })
}).on('error',function(){
    console.log('获取数据出错');
})

运行结果截图
部分截图如下:
Node.js 实现爬虫(1) —— 简单的爬虫程序_第2张图片

本文章参考慕课视频:http://www.imooc.com/learn/348

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