PhantomJS onResourceReceived返回的结果比预期的多

时间:2016-10-24 13:02:44

标签: javascript phantomjs

我使用phantomJSNetwork标签中获取所有请求网址,但我还收到了其他不需要的请求。

例如,如果你去marvel.com网络选项卡中有117个请求,我的脚本会返回142个结果,甚至更多......有没有办法只从网络选项卡中获取这117个请求?

这是我的代码:

var urls = ["https://marvel.com"];
var page = require('webpage').create();
var links = "";

var fs = require('fs');
var path = 'TestOutput.txt';

function handle_page(url){
  page.open(url,function(){
    fs.write(path, links, 'w');
    next_page();
  });

  page.onResourceReceived = function(response) {
    if(links.indexOf(response.url) == -1 && response.url.indexOf("http") !== -1) {
      links += response.url + '\n';
    }
  }
  links += '\n';
  links += '-------------------------------------------------------------------------------------------------';
  links += '\n';  
}

function next_page(){
  var url = urls.shift();
  if(!url) {
    phantom.exit(0);
  }
  handle_page(url);
}

next_page();

1 个答案:

答案 0 :(得分:0)

不同的浏览器行为不同。 PhantomJS是一个完整的浏览器,与Chrome操作无关。

对于大多数请求,page.onResourceReceived event handler被触发两次(实际上,如果网络连接没有在中间断开,我遇到的所有请求)。这是因为当第一个数据到达时(response.stage == "start")和连接关闭时(response.stage == "end"),此事件处理程序会被触发一次。

当我们查看数字时,这意味着PhantomJS只能看到大约71个(可能更多一点)的请求。这比Chrome看到的要少得多。原因有点神秘,但似乎很多与广告网站的连接在PhantomJS中被打破。许多广告根本没有加载。这可能有很多原因,但您很可能无法修复它。

您可以使用以下commandline options(为了便于阅读而添加换行符和反斜杠):

--web-security=false \
--local-to-remote-url-access=true \
--ignore-ssl-errors=true \
--ssl-protocol=any