Node js 请求和cheerio 等待页面完全加载

5 javascript request node.js

我正在尝试从页面上刮下图像,但如果该页面未完全加载,该页面将返回一个占位符源属性(完全加载大约需要 0.5 秒)我将如何使请求等待?

尝试做

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)
})
Run Code Online (Sandbox Code Playgroud)

Asi*_*nez 10

Cheerio 不是网络浏览器。它只是一个 HTML 解析器。这意味着未执行发出异步请求的 javascript 函数。

所以。除非您使用充当 Web 浏览器的工具,否则您无法为所欲为。例如,Selenium为许多 Web 浏览器添加了一个 API。

只要您想继续向具有异步内容加载的站点发出请求,就需要下载 Selenium 客户端并继续运行它。

此外,您将需要一个基于您使用的语言和您想要的 webdriver 的包装器。webdriver 用于添加对不同 Web 浏览器的支持。

我假设您正在使用 NodeJS 或类似的基于 js 的东西,所以,就这样吧。

并且一定要检查API。

希望能有所帮助。

你也可以检查PhantomJS。


Hun*_*ter 0

setTimeout(function, millseconds to wait) 将暂停您想要的秒数。setTimeout(function(){var $=cheerio.load(body)}, 2000)