2017-03-09 4 views
2

NodeJSのWebスクラップに問題があります。リモートWebページからデータを取り込みたいが、データはjavascriptからhtmlに挿入されています。私はPhantomJSを使い始めました。それは私の仕事を終わらせることを妨げる1つのことを除いて素晴らしい作品です。 PhantomJSの動作が遅すぎるので、このコードスニペットは約14秒間実行する必要があります!ただphantomJSそう秒より少し多く、そのはるかに高速に生データを返す要求ライブラリとPhantomJS open()too slow

var page = require('webpage').create(); 
page.open('https://www.halooglasi.com/nekretnine/izdavanje-stanova/novi-beograd---novi-merkator-id19270/5425485514649', function() { 
    phantom.exit(); 
    }); 

別の13秒程度に取り組んでいます。 PhantomJSは、不必要な操作をたくさんやっているようです。写真のビデオや何かをレンダリングする必要はありません。私はちょうどjavascriptを実行してhtmlからデータを取得することができます。 PhantomJSをスピードアップする方法を教えてもらえますか、私のニーズに合わせて他の高速なWebkitを使用するかもしれませんか?

答えて

6

処理時間を短縮するには、いくつかの方法があります。

1。より強力なサーバ/コンピュータ(マチューが正しく言及した通り)を入手してください。

はい、あなたはこの質問とは無関係だと主張することができますが、それを掻くことの問題は非常にです。最適化されていない$ 8 VPSの予算では、初期スクリプトは9589msで実行されていましたが、これは既に30%向上しています。

2。画像の読み込みをオフにします。それは...少し助けになります。 8160ms

page.settings.loadImages = false; 

3。ページを分析し、不要なネットワーク要求を見つけて取り消します。

Google Chromeのような通常のブラウザであっても、サイトはゆっくりと読み込まれます:AdblockPlusでのロード時間は129回/ 8.79秒です。 There are a lot of requests(gif、1Mb)、facebook、twitter(ウィジェットをフェッチするため)、広告サイトなどのサードパーティサイト向けのものが多い。

私たちは、あまりにもそれらを取り消すことができます。ページがロードされ、使用可能である一方、

block_urls = ['gstatic.com', 'adocean.pl', 'gemius.pl', 'twitter.com', 'facebook.net', 'facebook.com', 'planplus.rs']; 

page.onResourceRequested = function(requestData, request){ 
    for(url in block_urls) { 
     if(requestData.url.indexOf(block_urls[url]) !== -1) { 
      request.abort(); 
      console.log(requestData.url + " aborted"); 
      return; 
     } 
    } 
} 

を私のためのロード時間は今ちょうど4393msです:PhantomJS screenshot

私ははるかにせずに行うことができるとは思いませんページのコードで判断するのは非常にスクリプト重いためです。

全体コード:

var page = require('webpage').create(); 
var fs = require("fs"); 

// console.time polyfill from https://github.com/callmehiphop/console-time 
;(function(console) { 
    var timers; 
    if (!console) { 
    return; 
    } 
    timers = {}; 
    console.time = function(name) { 
    if (name) { 
     timers[ name ] = Date.now(); 
    } 
    }; 
    console.timeEnd = function(name) { 
    if (timers[ name ]) { 
     console.log(name + ': ' + (Date.now() - timers[ name ]) + 'ms'); 
     delete timers[ name ]; 
    } 
    }; 
}(window.console)); 

console.time("open"); 

page.settings.loadImages = false; 
page.settings.userAgent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36'; 
page.viewportSize = { 
    width: 1280, 
    height: 800 
}; 

block_urls = ['gstatic.com', 'adocean.pl', 'gemius.pl', 'twitter.com', 'facebook.net', 'facebook.com', 'planplus.rs']; 
page.onResourceRequested = function(requestData, request){ 
    for(url in block_urls) { 
     if(requestData.url.indexOf(block_urls[url]) !== -1) { 
      request.abort(); 
      console.log(requestData.url + " aborted"); 
      return; 
     } 
    }    
} 

page.open('https://www.halooglasi.com/nekretnine/izdavanje-stanova/novi-beograd---novi-merkator-id19270/5425485514649', function() { 
    fs.write("longload.html", page.content, 'w'); 

    console.timeEnd("open"); 

    setTimeout(function(){ 
     page.render('longload.png'); 
     phantom.exit(); 
    }, 3000); 

}); 
+2

私はあなたの結果に興味がある、これはあなたのために働いていますどのようにコメントしてください。 – Vaviloff

+3

大変ありがとうございました、これは私をたくさん助けました。あなたが私に与えたアドバイスは、プロセスのスピードを上げました!同じ問題を抱えている人にとって便利なもう1つのことがあります。便利なもう1つのメソッドがあります。これは 'page.settings.resourceTimeout'です。これを1000ミリ秒に設定すると、phantomJSはそのジョブだけを実行します1秒後に終了しますが、時間が短すぎるとコンテンツが読み込まれないことがありますが、非常に安全な解決策ではない場合がありますが、これは役に立ちます。お世話になりました! –