2014-11-19 6 views
6

Sto utilizzando CapserJS 1.1.0-beta3 combinato con PhantomJS 1.8.2.Come prevenire i reindirizzamenti in CasperJS?

Io chiamo un url che risponde con un reindirizzamento (HTTP 302). PhantomJS segue automaticamente il reindirizzamento, ma nel mio caso PhantomJS non dovrebbe seguire il reindirizzamento.

L'output di debug del reindirizzamento appare come:

[debug] [phantom] Navigation requested: url=https://foo.com/bar.jsp, type=Other, willNavigate=true, isMainFrame=true  

Come posso configurare PhantomJS/CapserJS di non seguire i reindirizzamenti?

risposta

7

C'è una piccola soluzione necessaria. Quindi devi prima identificare quale URL è il reindirizzamento. Con resource.received si riceve la risposta alla prima richiesta che contiene l'URL a cui deve essere reindirizzato. Ma non possiamo fare nulla da questo gestore di eventi. Pertanto salviamo l'URL di destinazione che viene identificato come target di reindirizzamento per dopo.

Ora il browser headless sottostante (PhantomJS o SlimerJS) segue il reindirizzamento richiedendo la nuova risorsa, ma ora resource.requested ci fornisce gli strumenti per annullare la richiesta (purtroppo questo non è documentato in CasperJS). Quindi lo script finale è simile al seguente:

var casper = require("casper").create(); 

var redirectURLs = [], 
    doLog = true; 

casper.on("resource.requested", function(requestData, networkRequest){ 
    if (doLog) console.log('Request (#' + requestData.id + '): ' + JSON.stringify(requestData) + "\n"); 
    if (redirectURLs.indexOf(requestData.url) !== -1) { 
     // this is a redirect url 
     networkRequest.abort(); 
    } 
}); 

casper.on("resource.received", function(response){ 
    if (doLog) console.log('Response (#' + response.id + ', stage "' + response.stage + '"): ' + JSON.stringify(response) + "\n"); 
    if (response.status === 301) { // use your status here 
     redirectURLs.push(response.redirectURL); 
    } 
}); 

casper.start("https://stackoverflow.com/q/27021176").run(function(){ 
    this.echo("DONE"); 
    this.exit(); 
}); 

Questa è adattato da mia risposta A: How to configure Poltergeist or PhantomJS to not follow redirects?

Si potrebbe fare lo stesso con la versione PhantomJS collegato direttamente a CasperJS scambiando page per casper.page, ma CasperJS ha un pochi vantaggi. Puoi aggiungere più gestori agli stessi eventi con la notazione casper.on e tutto il resto puoi decidere se tutte le risorse vengono gestite allo stesso modo o solo i carichi di pagina. Quindi è possibile scambiare resource.received per page.resource.received e resource.requested per page.resource.requested.

+0

Grazie! Ho eseguito il tuo script con CasperJS ma networkRequest.abort() non funziona. L'argomento networkRequest sembra essere indefinito. – Lavezzi

+0

Questo sembra essere dovuto alla tua vecchia versione di PhantomJS (l'ho appena provato). Non so da quale versione su questo funziona. Vi consiglio caldamente di aggiornare ad una versione più recente come 1.9.8 –