• 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实现高并发(限制不能频繁访问服务器)

     

     

  • 相关阅读:
    Mybatis多层嵌套查询
    UUID 唯一性实现原理
    oracle 多实例启动
    orcal启动多实例是报 ORA-00845: MEMORY_TARGET not supported onthis system
    java调用quartz 2.2.2方法总结。
    mybatis中like的使用(模糊查询)
    Orcal数据库实现主键ID自增
    spring cloud分布式关于熔断器
    spring cloud分布式健康检查
    spring cloud分布式整合zipkin的链路跟踪
  • 原文地址:https://www.cnblogs.com/Tabb/p/6583243.html
Copyright © 2020-2023  润新知