要想体验 Node.js 强大的异步特性,爬虫的场景就比较适合。
目标
- 使用 superagent 抓取网页
- 使用 cheerio 分析网页
superagent(http://visionmedia.github.io/superagent/ ) 是个 http 方面的库,可以发起 get 或 post 请求。
cheerio(https://github.com/cheeriojs/cheerio ) 可以理解成一个 Node.js 版的 jQuery,用来从网页中以 css selector 取数据,使用方式跟 jQuery 一样。
当在浏览器中访问 http://localhost:3000/ 时,输出 CNode(https://cnodejs.org/ ) 社区首页的所有帖子标题和链接以及作者,以 json 的形式返回。
输出示例:
[
{
"author": "xinyu198736",
"title": "【杭州】Node Party 第二期,9月25日下午,大搜车不见不散",
"href": "/topic/57e38330f7dea63b0e6ab912"
},
{
"author": "Samurais",
"title": "[ 北京]9月25日 NodeParty@科技寺,报名从速 !",
"href": "/topic/57de1b15b11d78e3659db5b0"
}
]
直接上代码:
var express = require('express');
var superagent = require('superagent');
var cheerio = require('cheerio');
var app = express();
app.get('/', function(req, res, next) {
// 用 superagent 去抓取 https://cnodejs.org/ 的内容
superagent.get('https://cnodejs.org/')
.end(function(err, sres) {
// 常规的错误处理
if (err) {
return next(err);
}
var items = [];
// sres.text 里面存储着网页的 html 内容,将它传给 cheerio.load,习惯性地命名为 `$`
// 接下来就可以使用熟悉的 jquery 操作了
var $ = cheerio.load(sres.text);
$('#topic_list .cell').each(function(index, element) {
var $img = $(element).find('img');
var $topic = $(element).find('.topic_title');
items.push({
author: $img.attr('title'),
title: $topic.attr('title'),
href: $topic.attr('href')
});
});
res.send(items);
});
});
app.listen(3000, function() {
console.log('app is listening at port 3000');
});
OK,一个简单的爬虫就是这么简单。在这里还没有利用到 Node.js 的异步并发特性。不过接下来的两篇内容都是关于异步控制的。