返回使用nodejs抓取网页的网址

时间:2014-02-27 15:10:59

标签: node.js scope request web-scraping cheerio

我正在尝试构建一个简单的网络应用程序,使用nodejs及其2个模块请求和cheerio来抓取网站。

我设法使用以下代码执行此操作:

    var printURL=function(url){
    request(url, (function() {
        return function(err, resp, body) {
            if (err)
                throw err;
            $ = cheerio.load(body);

            $('img').each(function(){
                console.log($(this).attr('src'));
            });

        }
    } )());
};

它可以在网站上打印图片的URL,但我真正想要做的是创建一个我可以在函数外部使用的URL列表。我试过这种方式,但它返回一个空列表:

var urlList=[];     
var printURL=function(url){
        request(url, (function() {
            return function(err, resp, body) {
                if (err)
                    throw err;
                $ = cheerio.load(body);

                $('img').each(function(){
                    urlList.push($(this).attr('src'));
                });

            }
        } )());
    };

我该如何解决这个问题?非常感谢

1 个答案:

答案 0 :(得分:3)

你需要等到所有回调都完成。

var urlList=[];     
var printURL=function(url){
    request(url, (function() {
        return function(err, resp, body) {
            if (err)
                throw err;
            $ = cheerio.load(body);
            var images = $('img');
            var counter = images.length;
            images.each(function(){
                urlList.push($(this).attr('src'));
                counter--;
                if (counter==0) {
                    // now we have all images!!
                    console.log(urlList);
                }
            });

        }
    })());
};

这是node.js的异步特性的一部分。如果事情变得更复杂,我建议您使用像async这样的流量控制库。

相关问题