2013-06-28 23 views
2

我剛剛寫了我的第一個腳本爲pjscrape,但我發現它運行速度非常緩慢。我對pjscrape和phantomjs都很陌生,所以我不知道哪一個是罪魁禍首。pjscrape很慢,還是PhantomJS?替代刮板?

我從localhost加載文件,所以瓶頸絕對不在傳輸中。

config.js腳本是這樣的:

pjs.addSuite({ 
    url: 'http://localhost/file.html'. 
    scraper: function() { 
     var people = $('table.person'); 
     var results = []; 

     $.each(people, function() { 
      var $this = $(this); 
      results.push({ 
       firstName: $this.find('.firstName').text(), 
       lastName: $this.find('.lastName').text(), 
       age: $this.find('.age').text() 
      }); 
     } 

     return results; 

    } 
} 

然後,我只是執行使用命令行指令here PhantomJS。

~> phantomjs pjscrape.js config.js

我運行在Chrome相同的代碼(只是刮刀()函數),它是即時的。在phantomjs/pjscrape中,它需要30秒。

任何線索是什麼造成緩慢?

有沒有更好的方法來做這個DOM屏幕抓取?也許一個nodejs解決方案?

+0

請出示phantom.js節點代碼。因爲問題可能在那裏。 – moka

+0

@MaksimsMihejevs我是phantom.js的新手,所以我不確定什麼是「節點代碼」。我編輯了我的問題以顯示完整的腳本。對我來說真的沒有太大的意義,所有的工作都是由pjscrape完成的。 –

+0

您是否測量了需要大部分時間執行的內容?由於phantom.js將QT與WebKit結合使用,因此您的節點會要求幻像運行單獨的進程,以啓動並初始化所有複雜組件,以便使「瀏覽器」正常工作。然後你可以加載東西並與之交互。初始化幻像 - 通常是一個瓶頸,因此您可能會考慮初始化一次然後重新使用。請測量瓶頸區域,這可能是幻像的初始化,但不是您上面發佈的腳本。 – moka

回答

2

如果Node.JS是一個選項,我可以向您介紹cheerio嗎?這是一個用於消費可疑格式HTML文檔的好庫。它爲您提供了一個類似於jQuery的API,用於處理您正在抓取的頁面的DOM類表示。與request搭配使用,它爲刮取HTML提供了一個非常簡單的環境。

你的榜樣最終會看起來像這樣(錯誤處理作爲練習留給讀者):

var cheerio = require("cheerio"), 
    request = require("request"); 

request("http://localhost/file.html", function(err, res, data) { 
    var $ = cheerio.load(data); 

    var people = $('table.person'); 
    var results = []; 

    $.each(people, function() { 
    var $this = $(this); 

    results.push({ 
     firstName: $this.find('.firstName').text(), 
     lastName: $this.find('.lastName').text(), 
     age: $this.find('.age').text() 
    }); 
    } 

    do_something_with(results); 
}); 
+0

+1,但我不得不說這不是我最喜歡的穀類食品。 – naomik

1

如果您使用的是網頁發送完全形成HTML,而且不需要客戶端JavaScript操作DOM到它的最終形式,跳過phantomjs,只是使用HTTP客戶端庫(節點核心或requestsuperagent刮或hyperquest)並使用cheerio從DOM中提取您需要的數據。

+0

你說得對,我不需要客戶端的JS,它只是靜態的HTML。我會調查這條路線。 –