o retorno de URLs raspagem de uma página da web com nodejs
-
23-12-2019 - |
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
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