2013-04-01 14 views
27

node.jsスクリプトでphantomjsを使用したいと思います。そこphantomjs-nodeライブラリです..しかし、残念ながら、著者は、彼がやっているかを説明するために、この奇妙なコーヒーのスクリプトコードを使用:phantomjsはnode.jsで動作しますか?

phantom = require 'phantom' 

phantom.create (ph) -> 
    ph.createPage (page) -> 
    page.open "http://www.google.com", (status) -> 
     console.log "opened google? ", status 
     page.evaluate (-> document.title), (result) -> 
     console.log 'Page title is ' + result 
     ph.exit() 

私はJavaScriptで直接phantomjsを使用した場合、今、それはthis次のようになります。

var page = require('webpage').create(); 
page.open(url, function (status) { 
    var title = page.evaluate(function() { 
     return document.title; 
    }); 
    console.log('Page title is ' + title); 
}); 

はとても基本的に、私はコーヒースクリプトdocumentationを読み取ることによって、(上記の通常のjavascriptのコードの最初のスニペットの同等を書くしようとしている。これは私がやったことです:

// file name: phantomTest.js 

var phantom = require('phantom'); 

phantom.create(function(ph) { 
    ph.createPage(function(page) { 
     page.open('http://www.google.com', function(status) { 
      console.log('opened google?', status); 
      var title = page.evaluate(function() { 
       return document.title; 
      }); 
      console.log('page title is ' + title);    
     }); 
    }); 
    ph.exit(); 
}); 

残念ながら、それは動作していません!実行した場合

シェルでは、何も起こりません。何も返されず、プロセスは停止しません..任意のアイデア?私はちょうどphantomjs faqでこれを読ん

更新

Q:なぜPhantomJSはNode.jsのモジュールとして書かれていませんか?

A:短い答え:「誰も2人のマスターを務めることはできません」

より長い説明は次のとおりです。

今のところ技術的に非常に難しいです。

すべてのNode.jsモジュールは基本的にNode.jsのコアである (つまり「マスター」)の「スレーブ」です。現在の状態では、PhantomJS(およびその付属の WebKit)は、 (イベントループ、ネットワークスタック、およびJavaScriptの実行)以上のすべての制御(同期問題で)を必要とします。

意図がちょうどいいのNode.js内で実行されているスクリプト からPhantomJSの使用についてであるならば、そのような「緩い結合」PhantomJSプロセスを起動 によって達成し、それと対話することができます。

mmm ..これはこれと関連がありますか?しかし、その図書館全体は意味をなさないでしょう!

アップデート2:私は同じことを行いwebにこのコードを見つけ

var phantom = require('phantom'); 
phantom.create(function(ph) { 
    return ph.createPage(function(page) { 
    return page.open("http://www.google.com", function(status) { 
     console.log("opened google? ", status); 
     return page.evaluate((function() { 
     return document.title; 
     }), function(result) { 
     console.log('Page title is ' + result); 
     return ph.exit(); 
     }); 
    }); 
    }); 
}); 

は、残念ながらそれは...同じ結果のいずれかを働いていません!

+3

から戻っていません。 –

+2

また、他のNode.jsブリッジよりも推奨されるhttps://github.com/sheebz/phantom-proxyがあります。人々はRuby、PHP、Node.jsで様々な成功を収めてPhantomJSのブリッジを使用してきました。 –

+3

私は強い言い訳をすることをお詫びします。私は質問から取り除きます。私はまた、 'ファントムプロキシ'を見ていきます。私の目標は物事を働かせることです他の人々の努力を軽視してはならない。 – abbood

答えて

38

phantomjs-nodeは、phantomjsの公式にサポートされているnpmパッケージではありません。代わりに、ノードとファントムの間のIPCチャネルとして機能するWebソケットを使用するWebサーバーを作成することにより、ノードとファントムの間に「奇妙な賢いブリッジ」を実装します。I'm not making this up

は、だから我々は()呼び出し、ExpressJSのインスタンスをスピンアップサブプロセスでファントムを開いて、アラートにsocket.ioメッセージを回す特殊なWebページでそれを指すことによってPhantomJSと通信します。それらのalert()コールはPhantomによってピックアップされ、そこに行く!

したがって、phantomjs-nodeが動作し、動作しなくても、黙って失敗したり、壮観に失敗しても驚くことはありません。また、phantomjs-nodeの作者以外の誰もが、phantomjs-nodeのトラブルシューティングを行うことはできません。

あなたの元の質問に対する答えは、phantomjs faqからの回答です:いいえ。幻とノードには相容れない違いがあります。両方とも、イベントループ、ネットワークスタック、JS実行のような基本的な低レベル機能を完全に制御して、同じプロセス内で協調することができないことを期待しています。

+5

うわー、それは厄介です!したがって、次の質問は、jqueryを使用して動的ページをスクラップする最良の方法は何ですか? – abbood

+0

@abbood私はそれが可能ではないと思います。あなたの目標は何ですか? –

+1

なぜそれは可能ではないでしょうか?私はいつものように私の[答え](https://github.com/tmpvar/jsdom/)を見つけたと思う。私はずっと簡単な解決策を見つけるために、 – abbood

0

同じ問題が発生しましたが、known issueにはphantomjs-nodeと新しいバージョンのnodejsがあります。この問題のコメントによると、ノード0.9.3のどこかで動作しなくなったようだ。それが解決されるまで、nodejsをダウングレードするか、node-phantomのような別のモジュールを試してみるか、exec/spawnだけを使用してください。

1
はこれにあなたのコードを変更

、それが働くことになります:あなたはまた、phridge試してみることができ

var phantom = require('phantom'); 
phantom.create(function(ph) { 
    ph.createPage(function(page) { 
    page.open("http://www.google.com", function(status) { 
     console.log("opened google? ", status); 
     page.evaluate((function() { 
     return document.title; 
     }), function(result) { 
     console.log('Page title is ' + result); 
     ph.exit(); 
     }); 
    }); 
    }); 
}); 
9

。あなたの例では、次のように書かれてただろう:あなたはちょうど私が行ったように、それはこれらのラッパーがうまく機能していないとあまりにも多くの痛みがあったのでPhantomJSを捨て、そしてあまりにもかなり人気があるZombie.jsで行くことができる

var phantom; 

// spawn a new PhantomJS process 
phridge.spawn() 
    .then(function (ph) { 
     phantom = ph; 
     return phantom.openPage("http://www.google.com"); 
    }) 
    .then(function (page) { 
     return page.run(function() { 
      // this function runs inside PhantomJS with this bound to a webpage instance 
      return this.title; 
     }); 
    }) 
    .then(function (title) { 
     console.log('Page title is ' + title); 
     // terminates the process cleanly 
     phantom.dispose(); 
    }); 
9

私は今phantom-nodeパッケージの新しいメンテナーです。もはやcoffeescriptは使用しません。

var phantom = require('phantom'); 

phantom.create().then(function(ph) { 
    ph.createPage().then(function(page) { 
    page.open('https://stackoverflow.com/').then(function(status) { 
     console.log(status); 
     page.property('content').then(function(content) { 
     console.log(content); 
     page.close(); 
     ph.exit(); 
     }); 
    }); 
    }); 
}); 

新しいバージョンははるかに高速で弾力性があります。もはやウェブソケットを使用しません。

1

var phantom = require('phantom'); 

phantom.create().then(function(ph) { 
    ph.createPage().then(function(page) { 
    page.open('https://stackoverflow.com/').then(function(status) { 
     console.log(status); 
     page.property('content').then(function(content) { 
     console.log(content); 
     page.close(); 
     ph.exit(); 
     }); 
    }); 
    }); 
}); 

。これが働いているようだが、私はいくつかの外部スクリプトファイルを使用してHTMLページを生成しようとしています。スクリプトファイルを挿入できません。私は次のようにしました。コールバックは、それがどのように動くのか理解していないおよび/またはあなたはそれがあなたのケースで作業する平野失礼であることを確認できないため、「ダム」何かを呼び出すラインpage.injectJs('./jQuery.min.js',function() {

var phantom = require('phantom'); 

    phantom.create().then(function(ph) { 
     ph.createPage().then(function(page) { 
     page.injectJs('./jQuery.min.js', function() { 
      page.property('content').then(function(content) { 
      console.log(content); 
      page.close(); 
      ph.exit(); 
      }); 
     }); 
     }); 
    }); 
関連する問題