<p>我从<a href="https://gist.github.com/suprememoocow/2823600" rel="nofollow noreferrer">here</a>获取截获代码,并将其包装在一个PhantomJS脚本中,该脚本将其注入我正在抓取的页面中。注意,必须在注入xhtp截获之前加载页面。
而且,必须告诉PhantomJS拦截并打印出打印到控制台.log. 在</p>
<p>我使用了Vijay接受的答案<a href="https://stackoverflow.com/questions/9246438/how-to-submit-a-form-using-phantomjs">here</a>中的[functions]技巧</p>
<p><sub>要获得更有趣的实时数据源,请尝试使用<a href="http://flightaware.com/live/" rel="nofollow noreferrer">http://flightaware.com/live/</a>而不是maps.google.com下面,请耐心等待,可能需要一到五分钟才能获得更新。</sub></p>
<p>以下是<strike>部分脚本(除了parse,对不起,未测试)</strike>PhantomJS脚本:</p>
<pre><code> var page = new WebPage(), testindex = 0, loadInProgress = false;
page.onLoadStarted = function() {
loadInProgress = true;
console.log("load started");
};
page.onLoadFinished = function() {
loadInProgress = false;
console.log("load finished");
};
page.onConsoleMessage = function(msg) {
console.log(msg);
};
var steps = [
function() {
//Load Login Page
page.open("http://maps.google.com");
},
function() {
page.render('check.png'); // see what's happened.
page.evaluate(
function( x) {
//inject following code from https://gist.github.com/suprememoocow/2823600
// I've added console.log() calls along with onConsoleMessage above to see XHR responses.
(function(XHR) {
"use strict";
var stats = [];
var timeoutId = null;
var open = XHR.prototype.open;
var send = XHR.prototype.send;
XHR.prototype.open = function(method, url, async, user, pass) {
this._url = url;
open.call(this, method, url, async, user, pass);
};
XHR.prototype.send = function(data) {
var self = this;
var start;
var oldOnReadyStateChange;
var url = this._url;
function onReadyStateChange() {
if(self.readyState == 4 /* complete */) {
var time = new Date() - start;
stats.push({
url: url,
duration: time
});
console.log( "Request:" + data);
console.log( "Response:" + this.responseText );
if(!timeoutId) {
timeoutId = window.setTimeout(function() {
var xhr = new XHR();
xhr.noIntercept = true;
xhr.open("POST", "/clientAjaxStats", true);
xhr.setRequestHeader("Content-type","application/json");
xhr.send(JSON.stringify({ stats: stats } ));
timeoutId = null;
stats = [];
}, 2000);
}
}
if(oldOnReadyStateChange) {
oldOnReadyStateChange();
}
}
if(!this.noIntercept) {
start = new Date();
if(this.addEventListener) {
this.addEventListener("readystatechange", onReadyStateChange, false);
} else {
oldOnReadyStateChange = this.onreadystatechange;
this.onreadystatechange = onReadyStateChange;
}
}
send.call(this, data);
}
})(XMLHttpRequest);
},""
);
},
function() {
// try something else here. Add more steps as necessary
}
];
interval = setInterval(function() {
if (!loadInProgress && typeof steps[testindex] == "function") {
console.log("step " + (testindex + 1));
steps[testindex]();
testindex++;
}
if (typeof steps[testindex] != "function") {
// commented out to run until ctrl-c
//console.log("test complete!");
//phantom.exit();
}
}, 500);
</code></pre>