2012-02-21 18 views
7

大概就一的NodeJS新手問題/ jsdom刮的NodeJS後的JavaScript網頁加載值

我想湊使用node.js中網站我使用jsdom和jquery獲取html並解析所需的東西。但是,不知何故,我得到的價值並不是網站上顯示的價值。 基本上這些值是由javascript動態改變的,我想要這些值。我使用nodejs/jsdom進行抓取的全部原因是js將被執行,並且在該事件發生後我會​​得到這些值。

有沒有什麼方法可以告訴jsdom等待JavaScript執行?還是我有這個全錯?我在這個問題上搜索了很多東西。

回答

7

你會使用類似casperjs http://casperjs.org/的更好。它是基於phantomjs的測試工具。它基本上就像在webkit瀏覽器中打開頁面一樣,只是沒有GUI。你可以寫一些類似的東西。我不認爲它適用於節點,但它應該很容易運行casper腳本並將輸出管道輸回到節點。:

var casper = require('casper').create({ 
    loadImages: true, 
    loadPlugins: true, 
    verbose: true, 
    //logLevel: 'info', 
    clientScripts: [ 
     'jquery-1.7.1.min.js', 
    ], 
    viewportSize: { 
     width: 1366, 
     height: 768, 
    }, 
    pageSettings: { 
     javascriptEnabled: true, 
     userAgent: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5', 
    }, 
}); 

casper.start(url); 

casper.thenEvaluate(function() { 
    //javascript code to run in the scope of the page 
}); 
0

我不知道你是否想要替代品,但是當我需要這種敏感的抓取時,我只是使用Firefox和iMacros。它運行所有的瀏覽器JS就好了,因爲它一個瀏覽器。

http://www.iopus.com/imacros/firefox/

0

首先,你如何使用jsdom?顯然,jsdom.env不會在DOM中執行腳本,只會在您致電jsdom.env時添加的腳本。如果你想執行腳本,我認爲你應該使用jsdom.jsdom

其次,您需要指定onload處理程序。這應該在文檔準備好之後執行,並且希望任何腳本都會根據您的喜好更改DOM。

事情是這樣的:

var jsdom = require('jsdom').jsdom 
    , document = jsdom(html) 
    , window = document.createWindow(); 

document.onload = function() { 
    // Do your stuff 
}