2012-10-30 8 views
15

Ich versuche, einen Screenshot einer Webseite mit PhantomJS zu machen. Insbesondere verwende ich das Beispiel der Erfassung espn.com von this Beispiel. Mein Code sieht wie folgt aus:Phantomjs funktioniert aber ist sehr langsam

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

dann gehe ich zu meinem PhantomJS Verzeichnis entweder mit meinem Terminal oder Eingabeaufforderung und führen:

phantomjs shotty.js 

Alles läuft sehr gut, jedoch dauert es 6-8 Sekunden abgeschlossen das Ausgabebild. Ist das normal? Gibt es einen schnelleren Weg, dies zu erreichen, so dass es in einer Sekunde oder weniger fertig ist?

Ich bin mit CentOS und Windows 7. Beide Boxen haben 8 GB RAM, 3,2 GHz CPU, und ich bin immer 22Mbp/s down und 1Mbp/s bis auf speedtest.net

+1

Es dauerte etwa 7 Sekunden, um die Seite in meinem Desktop-Browser zu machen; also ja, das scheint normal zu sein. – Quentin

+0

Vielen Dank für die Bestätigung! – Chris

+0

IPV6 deaktivieren und im Internet Explorer "Click Internet Options" => Klicken Sie auf Verbindungen => Klicken Sie Lan Einstellungen => UNCHECK "Automatisch Einstellungen erkennen – user956584

Antwort

9

Ja, das ist normal. Wenn Sie versuchen, zu rendern, wartet PhantonJS immer noch auf das Ereignis page.open, um das Ereignis load auszulösen, um anzuzeigen, dass das gesamte DOM geladen wurde.

Werfen Sie einen Blick auf was passiert, wenn ich espn.com lokal auf meinem System laden. Es dauert ~ 2 Sekunden, bis DOMContentLoaded abgeschlossen ist, und ~ 7 Sekunden für das Ereignis ready.

enter image description here

+1

Gut zu wissen, danke. – Chris

+0

Die Operation selbst sollte abhängig von der Seite schnell sein. Die langsame Sache ist die Prozess-Erstellung von phantomjs.exe! – Legends

25

Nun, in meinem Fall, die Seite für einige GET-Anfragen wartet und war nicht in der Lage der Anträge des Server zu erreichen und es hielt lange warten. Ich konnte es nur herausfinden, wenn ich die entfernte Debuggeroption verwendete.

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

und innerhalb der loadspeed.js

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

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

Datei und dann localhost Laden: 9000 in jedem Webkit-Browser (Safari/Chrom) und sehen die Konsolenprotokolle, wo ich es für wartete herausfinden konnte, einige unerreichbare Anfragen für eine lange Zeit.

TO THIS BYPASS - REDUZIERUNG DER TIMEOUT:

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

und Dinge waren sehr schnell danach. Hope this

+1

+1 und ich wollte hinzufügen, dass durch die Kontrolle Timeout können Sie warten, bis die ganze Seite zu laden und arbeiten mit einer Teilseite. – Efreeto

+0

Das war eine große Hilfe. +1 –

+0

Dies ist kein vollständiges und funktionierendes Beispiel und deshalb nicht so hilfreich. – Myz

2

hilft ich nicht gedacht, dass die folgenden funktionieren würde für mich, aber es tat (unter Windows):

geöffnet Internet Explorer> Internetoptionen> Verbindungen> LAN-Einstellungen und deaktivieren Sie die „Automatische Suche der Einstellungen“

Original Beitrag: https://plus.google.com/+MatthiasG%C3%B6tzke/posts/9v9BMCJj2k6