我可以使用phantomjs/casperjs获取原始页面源(与当前DOM相比)吗?

sup*_*oco 8 javascript phantomjs casperjs

我正在尝试获取特定网页的原始来源.

该页面执行一些脚本,一旦加载就修改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 ?! ***
});
Run Code Online (Sandbox Code Playgroud)

我已经尝试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) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

但该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;
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,最初修改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 ?! ***
});
Run Code Online (Sandbox Code Playgroud)

the*_*ary -1

关于可用于获取当前页面内容的文档。#debugPage()

casper.userAgent('Mozilla/5.0 (Macintosh; Intel Mac OS X)');

casper.start('http://www.xxxxxxx.xxx/login');

casper.waitForSelector('input#login', ... );

casper.then(function() {
  this.debugHTML();
});

casper.run();
Run Code Online (Sandbox Code Playgroud)

问候大卫