【发布时间】:2014-06-05 20:31:26
【问题描述】:
我正在尝试获取特定网页的原始来源。
页面一加载就会执行一些修改 DOM 的脚本。我想在任何脚本或用户更改文档中的任何对象之前获取源代码。
使用 Chrome 或 Firefox(可能还有大多数浏览器),我可以查看 DOM(调试实用程序 F12)或查看原始源代码(右键单击,查看源代码)。后者是我想要完成的。
是否可以使用 phantomjs/casperjs 做到这一点?
在进入该页面之前,我必须登录。这在 casperjs 上运行良好。 如果我浏览到该页面并呈现结果,我知道我在正确的页面上。
casper.thenOpen('http://'+customUrl, function(response) {
this.page.render('example.png'); // *** Renders correct page (current DOM) ***
console.log(this.page.content); // *** Gets current DOM ***
casper.download('view-source:'+customUrl, 'b.html', 'GET'); // *** Blank page ***
console.log(this.getHTML()); // *** Gets current DOM ***
this.debugPage(); // *** Gets current DOM ***
utils.dump(response); // *** No BODY ***
casper.download('http://'+customUrl, 'a.html', 'GET'); // *** Not logged in ?! ***
});
我尝试过this.download(url, 'a.html'),但它似乎没有共享相同的上下文,因为它返回 HTML,就好像我没有登录一样,即使我使用 cookie casperjs test.casper.js --cookies-file=cookies.txt 运行。
我认为我应该继续分析这个选项。
我也尝试过casper.open('view-source:url') 而不是casper.open('http://url'),但它似乎无法识别网址,因为我只是得到一个空白页。
我已经使用我拥有的实用程序查看了从服务器获得的原始 HTTP 响应,并且此消息的正文(即 HTML)是我需要的,但是当页面在浏览器中加载时,DOM 已经被修改.
我试过了:
casper.thenOpen('http://'+url, function(response) {
...
}
但是response 对象只包含标题和一些其他信息,但不包含正文。
我也尝试了事件onResourceRequested。
这个想法是中止特定网页(引用者)所需的任何资源的下载。
onResourceRequested: function(casperObj, requestData, networkRequest) {
for (var i=0; i < requestData.headers.length; i++) {
var obj = requestData.headers[i];
if (obj.name === "Referer" && obj.value === 'http://'+customUrl) {
networkRequest.abort();
break;
}
}
不幸的是,修改 DOM 的脚本最初似乎是内联的主 HTML 页面(或者此代码没有按照我的意愿执行)。
¿有什么想法吗?
这里是完整的代码:
phantom.casperTest = true;
phantom.cookiesEnabled = true;
var utils = require('utils');
var casper = require('casper').create({
clientScripts: [],
pageSettings: {
loadImages: false,
loadPlugins: false,
javascriptEnabled: true,
webSecurityEnabled: false
},
logLevel: "error",
verbose: true
});
casper.userAgent('Mozilla/5.0 (Macintosh; Intel Mac OS X)');
casper.start('http://www.xxxxxxx.xxx/login');
casper.waitForSelector('input#login',
function() {
this.evaluate(function(customLogin, customPassword) {
document.getElementById("login").value = customLogin;
document.getElementById("password").value = customPassword;
document.getElementById("button").click();
}, {
"customLogin": customLogin,
"customPassword": customPassword
});
},
function() {
console.log('Can't login.');
},
15000
);
casper.waitForSelector('div#home',
function() {
console.log('Login successfull.');
},
function() {
console.log('Login failed.');
},
15000
);
casper.thenOpen('http://'+customUrl, function(response) {
this.page.render('example.png'); // *** Renders correct page (current DOM) ***
console.log(this.page.content); // *** Gets current DOM ***
casper.download('view-source:'+customUrl, 'b.html', 'GET'); // *** Blank page ***
console.log(this.getHTML()); // *** Gets current DOM ***
this.debugPage(); // *** Gets current DOM ***
utils.dump(response); // *** No BODY ***
casper.download('http://'+customUrl, 'a.html', 'GET'); // *** Not logged in ?! ***
});
【问题讨论】:
标签: javascript phantomjs casperjs