在async.each中更新请求参数?

时间:2014-12-09 09:40:45

标签: node.js asynchronous request

我正在尝试修复我的node.js抓取程序。

他是其中的一员:

var site = 'http://www.some.com/';
var startPath = '/hambaarst-1.aspx?ipp=35';
var pageNumArray = [2,3,4,5,6,7,8,9,10,11,12];

async.series([
  function(callback) {
    async.each(pageNumArray, function(page, callback) {
        request(site+startPath, function(err, resp, body){
            if(!err && resp.statusCode == 200){
                var $ = cheerio.load(body);
                $('div.Info').find("a").each(function(){
                    var url = $(this).attr('href');
                    doctorPageUrlArray.push(url);
                }); 
            } else {
                console.log(resp.statusCode);
            }
            startPath = startPath.slice(0,11)+page+startPath.slice(-12); // HERE, I am changing start path.
            callback();
        });
    }, callback);
},

我需要循环11次,每次更改startPath变量:

startPath = startPath.slice(0,11)+page+startPath.slice(-12);

但相反,它只是首页抓取11次:'/hambaarst-1.aspx?ipp=35'

所以我猜因为节点'异步startPath没有更新。

我该如何解决?

1 个答案:

答案 0 :(得分:1)

var async        = require('async');
var format       = require('request');
var format       = require('util').format;

var site               = 'http://www.some.com';
var startPath          = '/hambaarst-%s.aspx?ipp=35';
var pageNumArray       = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
var doctorPageUrlArray = [];

async.each(pageNumArray, function (page, next) {
    console.log(format(site + startPath, page));

    request(format(site + startPath, page), function (err, res, body) {
        if (!err && resp.statusCode === 200) {
            var $ = cheerio.load(body);

            $('div.Info').find("a").each(function(){
                doctorPageUrlArray.push($(this).attr('href'));
            }); 
        } else {
            console.log(resp.statusCode);
        }

        next();
    });
}, function (err) {
    if (err) {
        return console.log(err);
    }

    console.log(doctorPageUrlArray);
});