2

我一直在尋找一種可以在服務器上運行的無頭網頁瀏覽器,以便爲網頁抓取工具編制索引單頁面應用程序。 Firslyt我嘗試過HTMLUnit和Selenium(HtmlUnitDriver),但他們似乎都對xhr請求有問題。如何爲搜索引擎優化PhantomJS以索引單頁面應用程序?

我發現PhantomJS表現更好,看起來比較成熟。 PhantomJS有一個internal webserver,所以我決定使用它與我的反向代理。然而,我運行了一個基準測試,PhantomJS以100%的CPU處理內核,平均頁面加載時間約爲4秒。原因是我必須等待瀏覽器加載所有資源才能獲得正確的結果。這裏是我的PhantomJS腳本:

var page = require('webpage'); 
var system = require('system'); 
var server = require('webserver').create(); 

// credit: http://backbonetutorials.com/seo-for-single-page-apps/ 
var service = server.listen(port, { 'keepAlive': true }, function(z, response) { 
    var request = page.create(); 
    var lastReceived = new Date().getTime(); 
    var requestCount = 0; 
    var responseCount = 0; 
    var requestIds = []; 
    var startTime = new Date().getTime(); 
    request.onResourceReceived = function (response) { 
     if (requestIds.indexOf(response.id) !== -1) { 
      lastReceived = new Date().getTime(); 
      responseCount++; 
      requestIds[requestIds.indexOf(response.id)] = null; 
     } 
    }; 
    request.onResourceRequested = function (request) { 
     if (requestIds.indexOf(request.id) === -1) { 
      requestIds.push(request.id); 
      requestCount++; 
     } 
    }; 
    request.settings = { 
     loadImages: false, 
     javascriptEnabled: true, 
     loadPlugins: false 
    }; 
    request.open(z.url, function (status, a) { 
     if (status !== 'success') { 
      console.log('FAIL to load the address '+a); 
     } 
    }); 
    var checkComplete = function() { 
     var now = new Date().getTime(); 
     if ((now - lastReceived > 300 && requestCount === responseCount) || now - startTime > 5000) { 
      clearInterval(checkCompleteInterval); 
      response.statusCode = 200; 
      response.headers = { 
       'Cache': 'no-cache', 
       'Content-Type': 'text/html; charset=UTF-8', 
       'Connection': 'Keep-Alive', 
       'Keep-Alive': 'timeout=5, max=100', 
       'Content-Length': request.content.length 
      }; 
      response.write(request.content); 
      response.close(); 
      request.release(); 
      console.log(request.url+" -> "+(now - startTime)); 
     } 
    } 
    var checkCompleteInterval = setInterval(checkComplete, 3); 

}); 

有沒有可以做,以加快腳本任何起色,我應該只是使用它的shell命令獲得更好的性能運行PhantomJS或有任何替代這些瀏覽器?

回答

3

你可以使用一些command line switches來提高拍攝性能:

首先,你可以忽略所有圖像與--load-images=no。執行HTML快照時無需加載圖像。

還可以實現與--disk-cache=yes緩存(使用--max-disk-cache-size設置字節大小)

最後,WebPage#onResourceRequested回調也可能是有用的終止與某些請求(跟蹤器,媒體文件...) NetworkRequest#abort方法。

+0

嗯,我沒有看到你已經將loadImages設置爲false,因此不需要第一個建議。 –

+0

感謝NetworkRequest#中止提示。 Facebook API和分析API「在這種情況下不是必需的,現在腳本看起來更快。 –

相關問題