2017-03-09 148 views
2

我在使用NodeJS的Web報廢時遇到問題,我想從遠程網頁獲取一些數據,但是數據是從javascript插入到html中的。我開始使用PhantomJS,除了阻止我完成我的工作的一件事外,它工作得很好。 PhantomJS工作太慢,這段代碼需要大約14秒才能執行!?PhantomJS open()太慢

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

與誰只是返回原始數據,它的速度更快,多一點比第二所以phantomJS工作另有13秒左右請求庫。它看起來像PhantomJS做了很多不需要的不必要的操作,我不需要渲染圖片視頻或任何我只需要執行的JavaScript,所以我可以使用cheerio從html獲取數據。你能告訴我如何加快PhantomJS或者爲我的需要使用其他更快的webkit?

回答

6

您可以採取多種措施來減少處理時間。

1。獲得更強大的服務器/電腦(正如Mathieu正確指出的)

是的,你可能會認爲這與問題無關,但在很大程度上是非常困難的。在沒有優化的預算8美元VPS的情況下,您的初始劇本運行時間爲9589ms,這已經提高了大約30%。

2。關閉圖像加載。它會幫助...一點。 8160ms加載時間。

page.settings.loadImages = false; 

3。分析頁面,找到並取消不必要的網絡請求。

即使在谷歌瀏覽器之類的普通瀏覽器中,該網站的加載速度也很慢:使用AdblockPlus的加載時間爲129個請求/8.79秒。 There are a lot of requests(gif,1Mb),很多,如果他們是第三方網站如臉譜,推特(小部件)和廣告網站。

我們可以取消他們太:PhantomJS screenshot

我不認爲更可以不這樣做:

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修改頁面的代碼,因爲根據頁面源代碼判斷,腳本很重。

整個代碼:

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

非常感謝你,這對我有很大的幫助。你給我的建議加快了這個過程!還有一件事對於有同樣問題的人可能有用,還有一種方法是有用的,那就是'page.settings.resourceTimeout',如果你將它設置爲1000毫秒,那麼phantomJS只爲其工作一秒鐘後完成,這可能很有用,雖然有時如果時間設置得太低,您的內容可能無法加載,所以它不是一個非常安全的解決方案。非常感謝您的努力! –