使用 superagent 与 cheerio 完成简单爬虫

要想体验 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 的异步并发特性。不过接下来的两篇内容都是关于异步控制的。

你可能感兴趣的:(使用 superagent 与 cheerio 完成简单爬虫)