基于nodejs的爬虫实现

技术点

  • nodejs
  • cheerio(解析网页dom节点)

以爬取知乎日报http://daily.zhihu.com/网站为例,实现了一个爬虫小程序。爬虫思路如下:

  1. 以请求http://daily.zhihu.com/网站首页为入口
  2. 解析列表页数据,获取每篇文章的标题title、详情页url、图片img
  3. 根据2中详情页url请求详情页,解析得到详情页文章内容数据
  4. 保存数据到数据库中

下面是代码实现:

第一步 爬虫入口

const crawler = function(callback) {
    var url = 'http://daily.zhihu.com/';
    parserMain(url, function(err, list) {
        for (let item of list) {
            parserContent(item.url, function(err, result) {
                item.info = result;
                saveData(item);
            });
        }
    });
}

第二步 解析列表页和详情页​​​​​​

  • 解析列表页
const parserMain = function(url, callback) {
    request(url, function(err, res) {
        if (err) {
            callback(err);
        }
        var $ = cheerio.load(res.body.toString());
        var articleList = [];
        $('.box a').each(function() {
            var title = $(this).children().last().text().trim();
            var url = 'http://daily.zhihu.com' + $(this).attr('href');
            var img = $(this).children().first().attr('src');
            var item = {
                title: title,
                url: url,
                img: img,
                //info: info,
            };
            articleList.push(item);
        });
        callback(null, articleList);
    });
}
  • 解析详情页
const parserContent = function(url, callback) {
    request(url, function(err, res) {
        if (err) {
            callback(err);
        }
        var $ = cheerio.load(res.body.toString());
        var content = $('.content p').text();
        callback(null, content);
    });
}

ps:第二步中的列表页cheerio定位可参考下面网站实际dom节点(cheerio相关文档可在官网查看):

基于nodejs的爬虫实现