2017-10-05 4 views
1

J'essaie d'extraire des images d'une page mais la page renvoie un attr source source si cette page n'est pas complètement chargée (le chargement complet prend environ 0,5 seconde) Comment devrais-je faire une demande d'attente?Node js requests et cheerio attendent que la page se charge complètement

essayé de faire

function findCommonMovies(movie, callback){ 

    request('http://www.imdb.com/find?ref_=nv_sr_fn&q='+ movie +'&s=all', function (error, response, body) { 
     if (error){ 
      return 
     }else{ 
      var $ = cheerio.load(body); 
      var title = $(".result_text").first().text().split("(")[0].split(" ").join('') 
      var commonMovies = [] 
      // var endurl = $("a[name=tt] .result_text a").attr("href") 
      var endurl = $('a[name=tt]').parent().parent().find(".findSection .findList .findResult .result_text a").attr("href"); 


      request('http://www.imdb.com' + endurl, function (err, response, body) { 

       if (err){ 
        console.log(err) 
       }else{ 

        setInterval(function(){var $ = cheerio.load(body)}, 2000) 

        $(".rec_page .rec_item a img").each(function(){ 


        var title = $(this).attr("title") 
        var image = $(this).attr("src") 

        commonMovies.push({title: title, image: image}) 
        }); 
       } 
       callback(commonMovies) 
      }); 
     } 
    }); 

} 
findCommonMovies("Gotham", function(common){ 
    console.log(common) 
}) 

Répondre

0

setTimeout (fonction, millseconds à attendre) fera une pause pendant combien vous voulez. setTimeout (fonction() {var $ = cheerio.load (corps)}, 2000)

+0

Ne fonctionne pas, je pense qu'il peut être asynchrone .. –

+0

Vous avez fait le temps d'attente de 2 secondes? Avez-vous essayé plus longtemps? C'est la seule fonction javascript (en plus de setInterval) qui vous permet de faire une pause. Vous pouvez essayer de déclarer une fonction: function cheerio() {var $ = cheerio.load (corps)} puis setTimeout (cheero, 2000); Peut-être que ce n'est pas aimer la fonction anonyme – Hunter

+0

Je suis assez nouveau pour javascript, donc je peux me tromper, mais ce n'est pas la réponse dans la demande ('http://www.imdb.com' + endurl, fonction (err, réponse, Je pensais peut-être qu'il y avait une méthode qui attendrait –

0

Il me semble que votre rappel est situé au mauvais endroit et il ne devrait pas être nécessaire de minuterie. Lorsque request() appelle son rappel, la réponse entière est prête, donc pas besoin d'une minuterie.

Voici le code avec le rappel au bon endroit et aussi changé de sorte qu'il a un argument d'erreur afin que l'appelant peut se propager et détecter les erreurs:

function findCommonMovies(movie, callback){ 
    request('http://www.imdb.com/find?ref_=nv_sr_fn&q='+ movie +'&s=all', function (error, response, body) { 
     if (error) { 
      callback(error); 
      return; 
     } else { 
      var $ = cheerio.load(body); 
      var title = $(".result_text").first().text().split("(")[0].split(" ").join('') 
      var commonMovies = []; 
      // var endurl = $("a[name=tt] .result_text a").attr("href") 
      var endurl = $('a[name=tt]').parent().parent().find(".findSection .findList .findResult .result_text a").attr("href"); 
      request('http://www.imdb.com' + endurl, function (err, response, body) { 
       if (err) { 
        console.log(err) 
        callback(err); 
       } else { 
        var $ = cheerio.load(body); 
        $(".rec_page .rec_item a img").each(function(){ 
        var title = $(this).attr("title"); 
        var image = $(this).attr("src"); 
        commonMovies.push({title, image}); 
        }); 
        callback(null, commonMovies); 
       } 
      }); 
     } 
    }); 
} 

findCommonMovies("Gotham", function(err, common) { 
    if (err) { 
    console.log(err); 
    } else { 
    console.log(common) 
    } 
}); 

Note: Ceci est accessible seulement le balisage HTML servi par le serveur pour les URL que vous demandez. Si ces pages ont du contenu qui est inséré par le navigateur Javascript, ce contenu ne sera pas présent dans ce que vous obtenez ici et aucun retard ne le fera apparaître. En effet, cheerio n'exécute pas le navigateur Javascript, il JUSTE simplement le code HTML que le serveur envoie à l'origine. Pour exécuter le navigateur Javascript, vous avez besoin d'un moteur de navigation plus complet que celui fourni par Cheerio, tel que PhantomJS qui va réellement lancer le Javascript de la page.