phantomJS如何从页面加载后开始的JS脚本中获得答案

phantomJS how to get answer from JS scripts which starting after the page have loaded

本文关键字:脚本 JS 答案 开始 加载 phantomJS      更新时间:2023-09-26

我正在寻找这个问题的解决方案。

网站在页面加载后加载了几个JS脚本,运行良好,页面从脚本中获得响应并将其呈现到网站页面。

但脚本返回JSON,我想用JSON得到这个响应,而不是从生成的页面得到。使用脚本的答案比使用选择器和循环从页面获取信息更快。

我尝试使用page.onResourceReceived(),但它只为我提供分析信息、文件名库存和响应大小;

我该如何获取此响应的正文?

如果我正确理解了您的要求,您可以尝试在网页端使用window.callPhantom将数据作为Object传递,并通过PhantomJS范围内的page.onCallback事件侦听器接收数据。

http://phantomjs.org/api/webpage/handler/on-callback.html

摘录:

当在网页上进行JavaScript窗口.callPhantom调用时,会调用此回调。传递给回调的唯一参数是一个数据对象。

注意:window.callPhantom仍然是一个实验性的API。在不久的将来,它可能会被基于消息的解决方案所取代,该解决方案仍将提供相同的功能。

尽管这种控制反转有很多可能的用例,但到目前为止,主要的用例是防止PhantomJS脚本需要在网页上不断轮询某些变量。

示例:网页(客户端)

if (typeof window.callPhantom === 'function') {
    window.callPhantom({ hello: 'world' });
}

PhantomJS(服务器端)

page.onCallback = function(data) {
    console.log('CALLBACK: ' + JSON.stringify(data));  // Prints 'CALLBACK: { "hello":     "world" }'
};

此外,请注意,WebPage#onCallback处理程序可以返回一个数据对象,该数据对象也将作为原始window.callPhantom调用的结果而携带回来。

示例:

网页(客户端)

if (typeof window.callPhantom === 'function') {
    var status = window.callPhantom({ secret: 'ghostly' });
    alert(status);  // Will either print 'Accepted.' or 'DENIED!'
}

PhantomJS(服务器端)

page.onCallback = function(data) {
    if (data && data.secret && data.secret === 'ghostly') {
        return 'Accepted.';
    }
    return 'DENIED!';
};