Обратные URL-адреса соскребания веб-страницы с nodejs
-
23-12-2019 - |
Вопрос
Я пытаюсь построить простое веб-приложение, соскоб веб-сайта, используя 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'));
});
}
} )());
};
.
Как я могу это исправить?Большое спасибо
Решение
Вам нужно подождать, пока все обратные вызовы не сделают.
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 .
Не связан с StackOverflow