web-dev-qa-db-ja.com

Phantomjsは機能しますが、非常に遅いです

PhantomJSを使用してWebページのスクリーンショットを撮ろうとしています。具体的には、 this の例からespn.comをキャプチャする例を使用しています。私のコードは次のようになります:

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

次に、ターミナルまたはコマンドプロンプトを使用してPhantomJSディレクトリに移動し、次のコマンドを実行します。

phantomjs shotty.js

すべてが正常に実行されますが、出力イメージが完了するまでに6〜8秒かかります。それは正常ですか? 1秒以内に完了するようにこれを達成するためのより速い方法はありますか?

CentOSとWindows7を使用しています。どちらのボックスにも8GBのRAM、3.2 GHzのCPUが搭載されており、speedtest.netで22Mbp/sがダウンして1Mbp/sがアップしています。

16
Chris

はい、これは正常です。レンダリングしようとしても、PhantonJSはpage.openイベントがloadイベントを発生させて、DOM全体がロードされたことを示します。

システムにローカルにespn.comをロードするとどうなるか見てみましょう。 DOMContentLoadedが完了するまでに約2秒かかり、次にreadyイベントが発生するまでに約7秒かかります。

enter image description here

9
Layke

さて、私の場合、ページはいくつかのGETリクエストを待っていて、リクエストのサーバーに到達できず、長い間待ち続けました。リモートデバッガオプションを使用した場合にのみ理解できました。

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

そして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));
};

次に、任意のWebkitブラウザー(safari/chrome)にlocalhost:9000をロードし、コンソールログを見て、到達不能な要求を長時間待っていることがわかりました。

これをバイパスするには-タイムアウトを減らします:

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

その後、物事は非常に迅速でした。お役に立てれば

24
Devaroop

私は次のことがうまくいくとは思いませんでしたが、私にとっては(Windowsでは)うまくいきました:

internetExplorer>インターネットオプション>接続> LAN設定を開き、「設定の自動検出」を無効にします

元の投稿: https://plus.google.com/+MatthiasG%C3%B6tzke/posts/9v9BMCJj2k6

2
ducci