因此,我试图在ESPN幻想足球的HTML精简版草稿页面中编写一个钩子,以交叉引用玩家排名列表(来自CSV文件),以消除可用池中已经起草的玩家。我过去曾亲手完成这项任务:但是在最后几轮比赛中有16支球队选秀,几乎不可能跟上,因为到那时候没有人真正知道球员是谁。
我非常喜欢Javascript和PhantomJS新手,所以请不要笑。
此时,我可以在控制台中看到page.onResourceReceived元数据,因为AJAX会轮询PhantomJS实例。但我无法弄清楚如何访问“浏览器”实际收到的数据。根据Chrome的检查员,“网络检查器”选项卡下的“预览”选项卡 - 时间同步信号或正在起草的实际玩家的数据将以JSON格式发送到浏览器。
长话短说,如何在收到page.onResourceReceived元数据时获取实际的JSON数据?
(P.S。我知道我注释掉了phantom.exit();这是为了防止脚本在重定向和onLoad完成后终止 - 我需要让它继续运行以监听草稿更新)
var draft = 'http://games.espn.go.com/ffl/htmldraft?leagueId=1246633&teamId=8&fromTeamId=8';
var draftURL = encodeURIComponent(draft);
var page = require('webpage').create(),
server = 'https://r.espn.go.com/espn/memberservices/pc/login',
data = 'SUBMIT=1&failedLocation=&aff_code=espn_fantgames&appRedirect=' + draftURL + '&cookieDomain=.go.com&multipleDomains=true&username=[redacted]&password=[redacted]&submit=Sign+In';
page.onResourceReceived = function (response) {
console.log('Response (#' + response.id + ', stage "' + response.stage + '"): ' + JSON.stringify(response));
};
page.open(server, 'post', data, function (status) {
if (status !== 'success') {
console.log('Unable to post!');
} else {
page.render('example.png');
//console.log(page.content)
}
//phantom.exit();
});
答案 0 :(得分:0)
以下版本的脚本只会获取并返回您正在访问的URL的全部内容。你不是真的会得到有用的json数据,我不认为,只是一个html页面,除非我遗漏了一些东西。在我的测试中,我得到的只是html:
var draft = 'http://games.espn.go.com/ffl/htmldraft?leagueId=1246633&teamId=8&fromTeamId=8';
var draftURL = encodeURIComponent(draft);
var page = require('webpage').create(),
server = 'https://r.espn.go.com/espn/memberservices/pc/login',
data = 'SUBMIT=1&failedLocation=&aff_code=espn_fantgames&appRedirect=' + draftURL + '&cookieDomain=.go.com&multipleDomains=true&username=[redacted]&password=[redacted]&submit=Sign+In';
page.open(server, 'post', data, function (status) {
if (status == 'success') {
var delay, checker = (function() {
var html = page.evaluate(function () {
var body = document.getElementsByTagName('body')[0];
return document.getElementsByTagName('html')[0].outerHTML;
});
if (html) {
clearTimeout(delay);
console.log(html);
phantom.exit();
}
});
delay = setInterval(checker, 100);
}
else {
phantom.exit();
}
});
答案 1 :(得分:0)
目前,phantomjs不包括onResponseReceived
事件中的响应主体。
您可以改为slimerjs,它反映了phantomjs,但允许您访问response.body(应该具有JSON数据)。示例:
http://darrendev.blogspot.jp/2013/11/saving-downloaded-files-in-slimerjs-and.html
或者,您可以编写chrome扩展并创建一个抓取数据的内容脚本。