2017-06-28 1 views
0

J'ai fait un script très simple qui gratte un site de recettes pour obtenir le titre, le temps de préparation et les ingrédients. Tout fonctionne bien sauf que le script n'est pas capable de gratter chaque page de mes tableaux. Parfois j'en ai 4, parfois 2, parfois même 0 ...Cheerio n'attend pas que le corps se charge

Il semble que le script n'attend pas que le corps soit complètement chargé. Je suis pleinement conscient que cheerio ne comprend pas javascript sur le site, mais pour tout ce que je sais l'information que je gratte ne sont pas générés à partir d'un script, il est pur HTML.

Comment puis-je demander à cheerio d'attendre 1 seconde lorsqu'une page est visitée, ou simplement d'attendre que le html soit complètement chargé.

Voici mon code, cela fonctionne de sorte que vous pouvez l'essayer, et un exemple de la sortie:

pools = [ 
 
    "http://www.marmiton.org/recettes/recette_salade-de-betteraves-a-l-orientale_16831.aspx", 
 
    "http://www.marmiton.org/recettes/recette_pain-d-epices-a-la-dijonnaise_16832.aspx", 
 
    "http://www.marmiton.org/recettes/recette_tarte-au-chocolat-et-creme-moka_16834.aspx", 
 
    "http://www.marmiton.org/recettes/recette_poulet-a-la-gaston-gerard_16836.aspx", 
 
    "http://www.marmiton.org/recettes/recette_assiette-paula_16837.aspx"] 
 

 
    var request = require("request"); 
 
    var cheerio = require("cheerio"); 
 
    var poolsLength = pools.length; 
 

 
    for (var i = 0 ; i < pools.length ; i++) { 
 
     var url = pools[i]; 
 
     request(url, function (error, response, body) { 
 
     if (!error) { 
 
     var $ = cheerio.load(body,{ 
 
      ignoreWhitespace: true 
 
    }); 
 
     var name = []; 
 
     var address = []; 
 
     var website = []; 
 

 
    $('body').each(function(i, elem){ 
 
      name = $(elem).find('.fn').text(); 
 
      address = $(elem).find('.preptime').text(); 
 
      website = $(elem).find('.m_content_recette_ingredients').text(); 
 
      console.log(name+"±"+address+"±"+website);} 
 
    )} 
 
    }) 
 
    };`

Comme vous pouvez le voir ci-dessus, il ne travaillait pour 2 sur 5 pages

Répondre

0

Vous pouvez essayer le code suivant, le setTimeout provoquera un délai pour le chargement de la page avant le raclage.

pools = [ 
     "http://www.marmiton.org/recettes/recette_salade-de-betteraves-a-l-orientale_16831.aspx", 
     "http://www.marmiton.org/recettes/recette_pain-d-epices-a-la-dijonnaise_16832.aspx", 
     "http://www.marmiton.org/recettes/recette_tarte-au-chocolat-et-creme-moka_16834.aspx", 
     "http://www.marmiton.org/recettes/recette_poulet-a-la-gaston-gerard_16836.aspx", 
     "http://www.marmiton.org/recettes/recette_assiette-paula_16837.aspx"] 

     var request = require("request"); 
     var cheerio = require("cheerio"); 
     var poolsLength = pools.length; 
     var interval = 10 * 1000; // 10 seconds; 
     for (var i = 0 ; i < pools.length ; i++) { 
      var url = pools[i]; 
      setTimeout(function (i) { 
      request(url, function (error, response, body) { 
      if (!error) { 
      var $ = cheerio.load(body,{ 
       ignoreWhitespace: true 
     }); 
      var name = []; 
      var address = []; 
      var website = []; 

     $('body').each(function(i, elem){ 
       name = $(elem).find('.fn').text(); 
       address = $(elem).find('.preptime').text(); 
       website = $(elem).find('.m_content_recette_ingredients').text(); 
       console.log(name+"±"+address+"±"+website);} 
     ) 
     } 
     }, interval * i, i); 
     }) 
     } 
+0

Merci! Exactement ce que je cherchais :). – gvdh

+0

en utilisant setTimeout pour attendre définitivement du temps n'est pas un bon choix – trungducng