Pergunta

Eu estou tentando criar um simples aplicativo de web scraping um site usando o nodejs e 2 módulos de pedido e cheerio.

Eu conseguir fazê-lo com o seguinte código:

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

        }
    } )());
};

Ele funciona bem para imprimir o URL das imagens no site, mas o que eu realmente estou tentando fazer aqui é criar uma lista de url que eu poderia usar fora da função.Eu tentei, mas retorna uma lista vazia:

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

            }
        } )());
    };

Como posso corrigir isso?Muito obrigado

Foi útil?

Solução

Você precisa esperar até que todos os callbacks são feitas.

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

        }
    })());
};

Esta é parte da natureza assíncrona do node.js.Se as coisas ficam mais complicadas, eu recomendo que você use um controle de fluxo de biblioteca como assíncrono.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top