• node 爬虫(二)async控制并发量


    var eventproxy = require('eventproxy');//并发控制
    var async = require('async');//并发量控制
    var express = require('express');
    var utility = require('utility');//utility.md5('aaa')转md5
    var superagent = require('superagent');//ajax请求
    var cheerio = require('cheerio');//页面dom操作,jq
    var app = new express();
    var url = require('url');
    var ep = new eventproxy();
    var inspect = require('util').inspect;
    app.get('/', function (req, res, next) {//本地页面访问路径,访问后执行 http://localhost:3000/
    superagent.get('http://wiki.jikexueyuan.com/project/node-lessons/superagent-cheerio.html').end(function (err, sres) {//访问源网址拿到其中更多页面的网址
     
    // 常规的错误处理
    if (err) {
      return next(err);
    }
     
    var urlArr = [];//需要获取的链接数组
    var $ = cheerio.load(sres.text);//sres.text可获取页结构,通过cherrio转为jq对象
    $('.detail-navlist-title a').each(function(i,e){
      var href = $(e).attr('href');
      urlArr.push(href);
    })
    //console.log(urlArr);
    var fetchUlr = function(url,someCB){
      superagent.get(url).end(function(err,sres){
        //当全部执行完毕后null为true即 callback(true,sres.text),现在理解为mapLimit最后的函数function(err,result)
        someCB(null,sres.text);
      })
    }
    async.mapLimit(urlArr,5,function(url,someCB){//最大并发数为5
      fetchUlr(url,someCB);//每次执行
    },function(err, result){//执行urlArr次后执行
      console.log('结束');
      var datas = result.map(function(dom){
      var $ = cheerio.load(dom);//每个页面的dom结构
      return ({
        title:$('.markdown-body h1').html()
      })
    })
     
    res.setHeader('content-type', 'text/html;charset=gb2312');//指定响应编码,否则乱码
    res.send(datas);//发送到页面显示
    })



     
     
    });
    }).listen(3000);
  • 相关阅读:
    Java1.7的HashMap源码分析-面试必备技能
    Springboot集成Swagger2
    springsecurity简单学习
    Java8的新特性
    HttpClient
    Filter的使用
    Spring拦截器和SpringAop实现
    运维工程师打怪升级进阶之路 V2.0
    欢迎加入微信交流群交流
    赞!7000 字学习笔记,一天搞定 MySQL
  • 原文地址:https://www.cnblogs.com/92xcd/p/9640608.html
Copyright © 2020-2023  润新知