2012-10-30 20 views
15

Sto tentando di acquisire uno screenshot di una pagina Web con PhantomJS. Nello specifico, sto utilizzando l'esempio di acquisizione di espn.com dall'esempio this. Il mio codice è simile al seguente:Phantomjs funziona ma è molto lento

var page = new WebPage(); 
    page.open('http://www.espn.com', function (status) { 
    page.render('fb.png'); 
    phantom.exit(); 
}); 

Ho poi andare al mio indice PhantomJS sia con il mio terminale, o dei comandi ed eseguire:

phantomjs shotty.js 

Tutto funziona grande, ma ci vogliono 6-8 secondi per completare l'immagine di output. È normale? C'è un modo più veloce per eseguire questo in modo che si completa in un secondo o meno?

Sto usando CentOS e Windows 7. Entrambe le scatole hanno 8GB di RAM, 3,2 GHz CPU, e sto ottenendo 22Mbp/e verso il basso e 1Mbp/s fino a speedtest.net

+1

Ci sono voluti circa 7 secondi per il rendering della pagina nel mio browser desktop; quindi sì, sembra normale. – Quentin

+0

Grazie per la verifica! – Chris

+0

DISABILITA IPV6 e in Internet Explorer "Fare clic su Opzioni Internet" => Fare clic su Connessioni => Fare clic su Impostazioni Lan => UNCHECK "Rileva automaticamente le impostazioni – user956584

risposta

9

Sì, questo è normale. Quando si tenta di eseguire il rendering, PhantonJS attenderà ancora l'evento page.open per attivare l'evento load per indicare che l'intero DOM è stato caricato.

Dai un'occhiata a cosa succede quando carico il espn.com localmente sul mio sistema. Sono necessari ~ 2 secondi per la fine di DOMContentLoaded, quindi ~ 7 secondi per l'evento ready da attivare.

enter image description here

+1

Buono a sapersi, grazie. – Chris

+0

L'operazione stessa dovrebbe essere veloce, a seconda della pagina. La cosa lenta è la creazione del processo di phantomjs.exe! – Legends

25

Beh, nel mio caso, la pagina era in attesa di alcune richieste GET e non era in grado di raggiungere il server le richieste e tenuti in attesa per lungo tempo. Ho potuto capirlo solo quando ho usato l'opzione del debugger remoto.

phantomjs --remote-debugger-port=9000 loadspeed.js <some_url> 

e all'interno delle loadspeed.js presentare

page.onResourceRequested = function (req) { 
    console.log('requested: ' + JSON.stringify(req, undefined, 4)); 
}; 

page.onResourceReceived = function (res) { 
    console.log('received: ' + JSON.stringify(res, undefined, 4)); 
}; 

e poi caricare localhost: 9000 in qualsiasi browser webkit (Safari/Chrome) e vedere i log della console dove ho potuto capire che era in attesa di alcune richieste irraggiungibili per molto tempo.

per aggirare questa - RIDURRE il timeout:

page.settings.resourceTimeout = 3000; //in milliseconds 

e le cose erano molto veloce dopo. Spero che questo aiuti

+1

+1 e volevo aggiungere che controllando il timeout è possibile saltare l'attesa per l'intera pagina da caricare e lavorare con una pagina parziale. – Efreeto

+0

Questo è stato di grande aiuto. +1 –

+0

Questo non è un esempio completo e funzionante e quindi non è di grande aiuto. – Myz