SUB.V8OS.NET

V8OS.NET のサブブログ

phantomjsをnodejsから利用する!

phantomjs。web関係に携わる人ならば、知らない人はほぼいないのでは無いでしょうか?

まぁ、知らない人もいるかと思うので、端的に説明すると「画面の無いブラウザ」です。 内部動作とか、あるURLに飛んだりとかをプログラマブルに利用することが出来ます。

しかしながら、このphantomjsはphantomjsというバイナリ中にjavascriptエンジンが組み込まれており、 nodejsなどのライブラリでは提供されていないために、利用するのが少々不自由です。

そこで、nodejsからphantomjsの機能を利用する方法を探しました。

有力そうなのは、この2つでした。

javascriptで策定中のasyncなどの新しい機能を積極的に取り入れる作者の心意気や、 apiのわかりやすさの面から、自分はphantomjs-nodeが良いのではという印象を受けました。

phantomjs-nodeを早速使ってみたいと思います。

準備

nodejsからphantomjsを使うための準備をしましょう

$ mkdir phantom-test && cd $_
$ npm init

# nodejsのバージョンがv5以上 <= (githubではそう書いてあるのだが、v7でないと動かなかった)
$ npm install phantom --save 

# nodejsのバージョンがv5未満
$ npm install phantom@2 --save

index.js

const phantom = require('phantom');

const USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36";


(async function() {
    const instance = await phantom.create();
    const page = await instance.createPage();
    await page.setting('userAgent', USER_AGENT)
    await page.on("onResourceRequested", function(requestData) {
        console.info('Requesting', requestData.url)
    });

    const status = await page.open('https://www.google.com');
    console.log(status);

    const content = await page.property('content');
    console.log(content);

    await instance.exit();
}());
$ node --harmony-async-await index.js

まとめ

以外に簡単に使うことが出来、非常に分かりやすかったです。