什么是爬虫,可以先看看百度百科-网络爬虫或者看维基百科-网络爬虫
需求
我现在需要获取我的CSDN博客的所有文章标题和文章url地址。
一种方法是点开每个文章一个一个的复制。很显然这个方法不太现实,当只有几篇文章时还是可以的,一但文章多了就是体力活了。
这个时候我们就需要通过技术的手段来获取了,爬虫就是其中的一种。
需要的资源
前面已经写了几篇关于Node.js的。现在还是使用Node.js+Express框架。但是我们还需要两个重要的模块:
request和cheerio。这个两个都是可以在NPM上面搜索的到的。
关于request和cheerio的使用大家可以自行看文档。
准备工作
在之前我的Node.js系列文档中一斤搭建好的框架中,首先加入request和cheerio这两个模块。
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;
在这里我们就可以体现出request和cheerio这两个模块作用了。
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开发,做了一个页面显示获取的数据,代码已经同步更新了。