1. 程式人生 > >node 爬蟲初嘗試(二)async控制並發量

node 爬蟲初嘗試(二)async控制並發量

響應 大並發 title 數組 並發控制 指定 ref gb2312 nav

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);

node 爬蟲初嘗試(二)async控制並發量