9

おそらくnodejs/jsdomに関する初心者の質問

node.js を使用して Web サイトをスクレイピングしようとしています。私はjsdomとjqueryを使用してhtmlを取得し、必要なものを解析しています。しかし、どういうわけか私が得ている値はウェブサイトに表示されているものではありません。基本的に、値はJavaScriptによって動的に変更され、それらの値が必要です。スクレイピングに nodejs/jsdom を使用していた全体的な理由は、js が実行され、そのイベントの後に値を取得するためでした。

javascriptが実行されるまで待つようにjsdomに指示する方法はありますか? それとも私はこれをすべて間違っていますか?私はこの問題について多くのことをグーグルで調べました。

4

2 に答える 2

8

casperjs http://casperjs.org/のようなものを使用することをお勧めします。これは、phantomjs に基づくテスト ユーティリティです。基本的には、Webkit ブラウザーでページを開くのとまったく同じですが、GUI はありません。のようなものを書くことができます。ノードで機能するとは思いませんが、キャスパースクリプトを実行して出力をノードに戻すのは簡単なはずです。

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
});
于 2012-05-04T07:34:50.953 に答える
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
}
于 2012-02-21T09:34:35.403 に答える