PhantomJS 2.0.0 不等待页面加载

PhantomJS 2.0.0 doesn't wait for page to load

下面的脚本在 links 数组中包含一些 URL。函数 gatherLinks() 用于从 links 数组中的 URL 中的 sitemap.xml 中收集更多的 URL。一旦links数组有足够的URLs(由变量limit决定),links数组中的每个URL调用函数request()来向服务器发送请求,获取响应并使用 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]);

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

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

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