提供されるモジュール群は5つ
- phantom: そのもの
- FileSystem: ファイルに出力したり、依存ファイルの存在確認したり
- System: コマンドラインから引数取りたいなら
- WebPage: きっと主役なrequire('webpage').create()するやつ
- WebServer: まだ使わない方がよさそう
おおまかな使い方は2パターン
pageを使いまわす
オーソドックスなやつかと。
PhantomJSのサンプルといえば!的な。
var page = require('webpage').create(); page.open('http://example.com', function(){
// do something..
page.evaluate(function(){
// do something...
});
phantom.exit();
});
コールバックに載せまくる
ネットワークの監視とか。
var page = require('webpage').create(); page.onResourceRequested = function (request) {
console.log('Request ' + JSON.stringify(request, undefined, 4));
};
page.onResourceReceived = function (response) {
console.log('Receive ' + JSON.stringify(response, undefined, 4));
};
page.open(url);
とにかくいろいろサンプルあるので、先に見るとイメージがつかめるかもです。
page.evaluate()に任意の引数を与えたい
それは困った。
// NG!
var url = 'http://example.com',
idPw = {
id: 'hoge',
pw: 'piyo'
}; page.open(url, function(){
page.evaluate(function(){
document.getElementById('login-name').value = idPw.id; // Undefined!!
document.getElementById('pass-word').value = idPw.pw; // Undefined!!
document.getElementById('myForm').submit();
});
});
これは困った・・。
evaluate(function, arg1, arg2, ...)
// OK!
var url = 'http://example.com',
idPw = {
id: 'hoge',
pw: 'piyo'
}; page.open(url, function(){
page.evaluate(function(idPw){
document.getElementById('login-name').value = idPw.id;
document.getElementById('pass-word').value = idPw.pw;
document.getElementById('myForm').submit();
}, idPw); // 渡せた!
});
UserAgentを偽装する
やり方は2通り。
推奨されてるのは最初のやつだそうな。
page.settingsに設定
// var page … page.settings = {
userAgent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25'
}; // page.open(…
page.customHeadersに設定
// var page … page.customHeaders = {
User-Agent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25'
}; // page.open(…
この方法で設定すると、最初の方法を上書きしてしまうそうです。
ログイン処理するならライブラリ併用が無難
ログインした後のリダイレクト待ちとか、そもそも重いページとか、単純なコールバックで上手くいかない時とか。
ここに書かれてる内容で、やりたいことのほとんどはできるのではないでしょうか。
あとはflow.jsとか。
ページへは、
if(!phantom.injectJs('./utils/jsdeferred.js')){
console.log('This script requierd jsdefferred.js!');
phantom.exit(1);
}
という具合で差し込めば使えます。
書式やスタイルはNode.jsと同じ
まぁ当たり前ですが・・。
コールバックの嵐になりがちなあたりや、CommonJSスタイルでのモジュール読み込みとか。
というかCasperJS
PhantomJSのAPIをいろいろ調べるとか、するより先に、コレ使ったほうが早いし楽です。
おそらくスクレイピング絡みのほとんどのことは、難なく実現できちゃいます。
CasperJSのメモとか、作ったサンプルはまた個別の記事で載せようと思います。
from:http://lealog.hateblo.jp/entry/2013/05/18/002824