Cheerio不等待身体加载

时间:2017-06-28 08:33:20

标签: cheerio

我做了一个非常简单的脚本,它抓住了一个食谱网站,以获得标题,准备时间和成分。一切正常,但脚本无法抓取我的数组的每一页。有时我得到4个,有时2个,有时甚至0个......

似乎脚本没有等待身体完全加载。我完全清楚,cheerio并不了解网站上的javascript,但据我所知,我所知道的信息并非由任何脚本生成,而是纯HTML。

我如何要求cheerio在访问页面时等待1秒钟,或者只是等待html完全加载。

这是我的代码,它可以运行,你可以尝试它,以及输出的一个例子:



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);}
     )}
    })
    };`
&#13;
&#13;
&#13;

如上所示,它仅适用于5页中的2页。

2 个答案:

答案 0 :(得分:0)

您可以尝试以下代码,setTimeout会在抓取之前导致页面加载延迟。

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

答案 1 :(得分:0)

为了处理许多页面报废,只需提供一个callback函数来标记任务完成时间,然后使用async.parallel模块运行。

我的解决方案:

  

http://paste.ubuntu.com/p/vfDnbjPw87/