Node.js爬虫技术

什么是爬虫,可以先看看百度百科-网络爬虫或者看维基百科-网络爬虫

需求

我现在需要获取我的CSDN博客的所有文章标题和文章url地址。
一种方法是点开每个文章一个一个的复制。很显然这个方法不太现实,当只有几篇文章时还是可以的,一但文章多了就是体力活了。
这个时候我们就需要通过技术的手段来获取了,爬虫就是其中的一种。

需要的资源

前面已经写了几篇关于Node.js的。现在还是使用Node.js+Express框架。但是我们还需要两个重要的模块:
requestcheerio。这个两个都是可以在NPM上面搜索的到的。
关于requestcheerio的使用大家可以自行看文档。

准备工作

在之前我的Node.js系列文档中一斤搭建好的框架中,首先加入requestcheerio这两个模块。
1. 引入新的模块
package.json文件的dependencies字段后面再加入两个:

"request": "latest"
"cheerio": "latest"

latest表示的是最新的版本。为什么用latest,因为我不知道他们的版本号。O(∩_∩)O~
2. 安装模块
cd到项目目录下面,先执行
npm install等待引入的模块加载完成。
3. 找我的CSDN博客的特点
以我的CSDN博客地址为例:
http://blog.csdn.net/zhuming3834/article/list/1
我们可以看到地址大概由4部分组成:
ip地址(http://blog.csdn.net/) + 用户名(zhuming3834) +目录(article/list/) + 分页(1)。

编写代码

在项目的app.js文件中加入新的js文件reptile.js的路由:

var reptile = require('./routes/reptile');
app.use('/reptile', reptile);

在目录routes下新建reptile.js文件。
代码如下:

var express = require('express');
var router = express.Router();
// 添加依赖
var request = require('request'); 
var cheerio = require('cheerio');
/* GET users listing. */
router.get('/reptile', function(req, res, next) {
  var param = req.query || req.params; 
  var indexPage = param.page;
  if (indexPage == null) {
     indexPage = 1;
  }
  var url = 'http://blog.csdn.net/zhuming3834/article/list/' + indexPage;
  request(url, function (error, response, body) {
      if (!error && response.statusCode == 200) {
        // 获取html文档
        var $ = cheerio.load(body);
        // 计算总页数
        var allCount = $('#blog_statistics li span').first().text();
        var page = parseInt(allCount)/20;
        var pageStr = page.toString();
        // 不能被整除
        if (pageStr.indexOf('.')>0) {
            page = parseInt(pageStr.split('.')[0]) + 1; 
        }
        var data = {};  // 返回的json数据
        var articles = []; // 文章集合
        data.msg = '爬取成功';
        data.status = '100';
        data.allPages = page;
        data.currentPage = parseInt(indexPage);
        $('.link_title a').each(function(i,elem){
            var article = {}; // 每篇文章的字典
            article.title = $(this).text().replace(/(^\s*)|(\s*$)/g,""); // 去除标题前后的空格
            article.url = 'http://blog.csdn.net' + $(this).attr('href');
            articles.push(article);
        })
        data.articles = articles; 
        res.end(JSON.stringify(data));
      }else{
        var data = {};  // 返回的json数据
        data.msg = '爬取失败';
        data.status = '101';
      }
  })
});
module.exports = router;

在这里我们就可以体现出requestcheerio这两个模块作用了。
request是抓取到网页的html代码,cheerio就是可以让我们可以像jQuery一样去解析获取的html代码。
至于为什么这么去解析html文档可以我们先看看网页源码,再确定需要接续那个节点。解析之后,就是把需要的数据拼接成json文件返回。
开放一个我制作好的接口:http://101.200.85.8/reptile?page=1大家可也看看效果。

{
msg: "爬取成功",  // 状态提示信息
status: "100",   // 状态码 100表示成功  101表示失败
allPages: 7,     // 总的页码数
currentPage: 1,  // 当前的页码数
articles: [      // 文章数据集合
{
    title: "Express修改模板引擎",  // 文章标题
    url:"http://blog.csdn.net/zhuming3834/article/details/55509607"   // 文章url地址
}
]
}

这里我结合我之前的开源项目HBuilder webApp开发,做了一个页面显示获取的数据,代码已经同步更新了。

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值