Sto cercando di ottenere la fonte originale per una particolare pagina web.Posso ottenere la fonte originale della pagina (vs DOM corrente) con phantomjs/casperjs?
La pagina esegue alcuni script che modificano il DOM non appena viene caricato. Vorrei ottenere la fonte prima che uno script o un utente modifichi qualsiasi oggetto nel documento.
Con Chrome o Firefox (e probabilmente la maggior parte dei browser) posso neanche guardare il DOM (debug utilità F12) o di guardare fonte originale (tasto destro del mouse, visualizza sorgente). Quest'ultimo è ciò che voglio realizzare.
E 'possibile farlo con phantomjs/casperjs?
Prima di accedere alla pagina devo effettuare il login. Funziona perfettamente con casperjs. Se sfoglio la pagina e visualizzo i risultati, so che sono nella pagina giusta.
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 ?! ***
});
Ho provato this.download(url, 'a.html')
ma non sembra condividere lo stesso contesto, in quanto restituisce HTML come se non ero collegato, anche se corro con biscotti casperjs test.casper.js --cookies-file=cookies.txt
.
Credo che dovrei continuare ad analizzare questa opzione.
Ho anche provato casper.open('view-source:url')
invece di casper.open('http://url')
ma sembra che non riconosce l'url da quando ottengo solo una pagina vuota.
Ho guardato la risposta HTTP non ricevuta dal server con un'utilità che ho e il corpo di questo messaggio (che è HTML) è quello di cui ho bisogno ma quando la pagina carica nel browser il DOM è già stato modificata.
ho provato:
casper.thenOpen('http://'+url, function(response) {
...
}
Ma l'oggetto response
contiene solo le intestazioni e alcune altre informazioni, ma non il corpo.
Ho provato anche con l'evento onResourceRequested.
L'idea è di interrompere il download di qualsiasi risorsa necessaria per una pagina Web specifica (il referer).
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;
}
}
Purtroppo lo script che modifica il DOM inizialmente sembra essere in linea la pagina HTML principale (o del presente codice non sta facendo quello che mi piace fare).
¿Qualche idea?
Ecco il codice completo:
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 ?! ***
});
OP vuole fonte del tutto invariato, ma debugPage stampa la pagina corrente. Questa non è una risposta. –
Ho aggiornato la mia risposta per utilizzare #debugHTML() anziché #debugPage() –
Che non funziona neanche. Non restituisce l'HTML originale. – supercoco