Nodejs 网络爬虫(资讯爬虫) 案例

1. superagent

superagent 是一个流行的nodejs第三方模块,专注于处理服务端/客户端的http请求。在nodejs中,我们可以使用内置的http等模块来进行请求的发送、响应处理等操作,不过superagent提供了更加简单、优雅的API,让你在处理请求时更加方便。而且它很轻量,学习曲线平滑,内部其实就是对内置模块的封装。

可以认为是node端的ajax

request

   .post('/api/pet')

   .send({ name: 'Manny', species: 'cat' })

   .set('X-API-Key', 'foobar')

   .set('Accept', 'application/json')

   .end(function(err, res){

     if (err || !res.ok) {

       alert('Oh no! error');

     } else {

       alert('yay got ' + JSON.stringify(res.body));

     }

   });

2. supervisor node

supervisor 可以监视代码的改动,并自动重启 Node.js,保证改动服务器代码后,不用手动重启服务器

npm -g install supervisor 必须全局安装

3. cheerio

在node中可以使用类似jQuery的方法操作html元素,可以方便的对爬虫到的网页html资源进行相关操作,上手容易,操作方法和jquery几乎一致

var cheerio = require("cheerio");

var server = require("./curl");

var url = "http://v.163.com/special/opencourse/englishs1.html"

server.download(url, function(data) {

  if (data) {

    //console.log(data);

    var $ = cheerio.load(data);

    $("a.downbtn").each(function(i, e) {

        console.log($(e).attr("href"));

    });

    console.log("done");

  } else {

      console.log("error");

  }

});

4. 爬虫逻辑实现完整代码演示

功能页面获取数据如下:

var superagent = require('superagent');  

var cheerio = require('cheerio');

var url = require('url');

var qs = require('querystring');

var cnodeUrl = "https://www.xxxx.com/";

var CNode = function(url) {

    cnodeUrl = url;

}

CNode.prototype = {

    getData: function(res) {   此处resindex页面中的res

        superagent.get(cnodeUrl)   实现类似ajax获取页面数据

            .end(function(err, sres) {   写回调函数

                if (err) throw err;

                var $ = cheerio.load(sres.text);   引入cheerio入口

                cheerio的类似jquery操作

                var lastPageUrl = $('.className li:last-child').find('a').attr('href');

                var queryUrl = url.parse(lastPageUrl).query;  获取url参数

                var obj = qs.parse(queryUrl);

                var totalPages = obj.page;

                var items = [];  设置数组,存储需要的数据

                $('#id .className').each(function(index, element) {

                   var $element = $(element);

                   var type = $element.parent().parent().find('.topic_tab').text();

                   items.push({

                        title: $element.attr('title'),

                        href: $element.attr('href'),

                        link: url.resolve(cnodeUrl, $element.attr('href')),

                        type: type

                    })

                    console.log(items)

                })

                items.totalPages = totalPages;

                res.send(items);  向页面发送处理好的数据

            })

    }

}

module.exports = CNode;   对外暴露数据

index页面加载数据如下:(由于是在express assistant环境下写创建的,所以此处是以路由形式向外暴露,服务器运行在bin/www文件中)

var express = require('express');

var router = express.Router();

var CNode = require('./cnode');

/* GET home page. */

router.get('/', function(req, res, next) {

    var requestUrl = " https://www.xxxx.com/";

    var _cnode = new CNode(requestUrl);

    _cnode.getData(res);

});

module.exports = router;

5. node-schedule 实现定时任务(可与高并发结合)

6. async实现高并发(限制不能频繁访问服务器)

 

 

原文地址:https://www.cnblogs.com/Tabb/p/6583243.html