PhantomJS 2.0.0不会等待页面加载

时间:2015-09-08 06:19:58

标签: javascript phantomjs screenshot

下面的脚本包含links数组中的一些网址。函数gatherLinks()用于从links数组中的URL的sitemap.xml收集更多URL。一旦links数组有足够的URL(由变量limit决定),就会为request()数组中的每个URL调用函数links,以便向服务器发送请求,获取使用page.render()功能响应并保存图像。

问题在于,当我使用PhantomJS 2.0.0运行它时,许多图像缺少大量内容,即PhantomJS可能不会等待加载所有内容。但是当我使用PhantomJS 1.9.8时,所有内容都加载得很好。可能是什么原因?

var webpage = require('webpage');
var system = require('system');
var fs = require('fs');
var links = [];

links = [
    "http://somesite.com",
    "http://someothersite.com",
       . 
       .
       .
 ];

var index = 0, fail = 0, limit = 20;
finalTime = Date.now();

var gatherLinks = function(link){
  var page = webpage.create();
  link = link + "/sitemap.xml";
  console.log("Fetching links from " + link);

  page.open(link, function(status){
    if(status != "success"){
      console.log("Sitemap Request FAILED, status: " + status);
      fail++;
      return;
    }

    var content = page.content;
    parser = new DOMParser();
    xmlDoc = parser.parseFromString(content, 'text/xml');
    var loc = xmlDoc.getElementsByTagName('loc');

    for(var i = 0; i < loc.length; i++){
      if(links.length < limit){
        links[links.length] = loc[i].textContent;
      } else{
        console.log(links.length + " Links prepared. Starting requests.\n");
        index = 0;
        page.close();
        request();
        return;
      }
    }

    if(index >= links.length){
      index = 0;
      console.log(links.length + " Links prepared\n\n");
      page.close();
      request();
      return;
    }

    page.close();
    gatherLinks(links[++index]);
  });
};

var request = function(){
  t = Date.now();
  var page = webpage.create();
  page.open(links[index], function(status) {
    console.log('Loading link #' + (index + 1) + ': ' + links[index]);
    console.log("Time taken: " + (Date.now() - t) + " msecs");

    if(status != "success"){
      console.log("Request FAILED, status: " + status);
      fail++;
    }

    page.render("img_200_" + index + ".jpeg", {format: 'jpeg', quality: '100'});
    if(index >= links.length-1){
      console.log("\n\nAll links done, final time taken: " + (Date.now() - finalTime) + " msecs");
      console.log("Requests sent: " + links.length + ", Failures: " + fail);
      console.log("Success ratio: " + ((links.length - fail)/links.length)*100 + "%");
      page.close();
      phantom.exit();
    }

    index++;
    page.close();
    request();
  });
}

gatherLinks(links[0]);

1 个答案:

答案 0 :(得分:0)

PhantomJS没有定义在页面加载过程中何时调用page.open回调。所以,没有任何错误的声称。

可能您可以使用setTimeout()添加静态等待金额,这对于动态网站应该有所帮助。还有一些方法可以通过计算使用page.onResourceRequested发送的请求数以及使用page.onResourceReceived / page.onResourceTimeout / page.onResourceError完成的请求数来查看是否有待处理的请求。

如果它实际上是一个PhantomJS错误,那么除了尝试一些命令行开关之外没有太多可以。