PhantomJS

PhantomJSって何

Webkitベースのheadless browser。つまりプログラムで制御可能な画面の無いブラウザと思ってよい

install(Linux Mint 15 編)

apt で一発で入る

使い方

コマンドとしてインストールされるので使うだけ 引数に制御用のJSファイルを指定する

$ phantomjs hoge.js

スクリプトにパラメータを渡す

コマンドラインの引数で

$ phantomjs hoge.js piyo fuga

という風に渡して実行すると

hoge.js の中で phantom オブジェクトから

var piyo = phantom.args[0]; //=> piyo

という感じでとれる

以前のバージョンでは↑の方法で取得していたのだが、2系のバージョンでは、このように取得するように変更になったようだ

var system = require('system');
var args = system.args;
var hogejs = args[0];
var piyo = args[1];
var fuga = args[2];

ウェブサイトを開く

var page = require('webpage').create();
page.open('http://www.hogehoge.co.jp/', function(){
    // ここで何かやる
    phantom.exit();  // 終了
});

開いたウェブサイト上でJavaScriptを実行する

PhantomJS ver 1.6.0

evaluate メソッドを使うことで開いたウェブサイト上でJavaScriptを実行することができる。

var result = page.evaluate(function(_hoge){
    // ここで書かれるコードはopenで開いたページ環境で実行される
    // この関数スコープに外部からクロージャで環境を持ち込むことはできない
    return "hogehoge";
}, hoge);

しかし PhantomJS をコントロールする環境と、ウェブサイトという環境と2個の環境に跨ってJSコードを記述するので通常のJSと異なる制約がある。 この evalueate に渡す関数オブジェクト内にクロージャで外部(PhantomJS をコントロールする環境)から変数の参照を持ち込むことができない。 この制約は結構痛い。

↑1.6系 ではそうだったようだが、2系 では普通に PhantomJS を制御するコードからその内部のコードにクロージャで値を持ち込めそう・・・

evaluate の第二引数から実行する関数に値を渡すことができる。サンプルのコードではhoge変数の内容を_hoge引数で受けるように書いている。 ここに単純な値だけでなく関数自体も渡せるようだ。

しかしなんでもかんでも渡せるようはないみたいでこのへんの実装、挙動が若干怪しい。 使うときは自分が使う状況でも使えるのかというのをまずテストしたほうがいいだろう。

evaluate に渡した関数の return の値が evaluate メソッドの戻り値 として受け取れる。

こいつもなんでもかんでも受け取れるわけではないだろう・・・おそらく。 ウェブサイト環境のJSから関数オブジェクトを引き抜いて PhantomJS 環境に渡して実行・・・しかもそれがクロージャで繋がっているなんてことは考えにくい。 ここも使う前に用途に応じて挙動を確認しておいたほうがいいだろう。

スクリーンショットを取る

画面が無いけどスクリーンショットは撮れる

page.render('screenshot.png');

UserAgent を指定する

open する前に設定する

var page = require('webpage').create();
page.settings.userAgent = 'Mozilla/5.0 (iPhone; CPU iPhone OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53';

関連ページ

参考サイト

タグ

browser/phantomjs.txt · 最終更新: 2017-10-10 11:18 by ore