PhantomJSのメモいろいろ

提供されるモジュール羣は5つ

  • phantom: そのもの
  • FileSystem: ファイルに出力したり、依存ファイルの存在確認したり
  • System: コマンドラインから引數取りたいなら
  • WebPage: きっと主役なrequire('webpage').create()するやつ
  • WebServer: まだ使わない方がよさそう

おおまかな使い方は2パターン

pageを使いまわす

オーソドックスなやつかと。
PhantomJSのサンプルといえば!的な。javascript

var page = require('webpage').create();

page.open('http://example.com', function(){
  // do something..
  page.evaluate(function(){
    // do something...
  });
  phantom.exit();
});

コールバックに載せまくる

ネットワークの監視とか。html

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);

とにかくいろいろサンプルあるので、先に見るとイメージがつかめるかもです。java

參考:phantomjs/examples at master · ariya/phantomjs · GitHubgit

page.evaluate()に任意の引數を與えたい

Evaluates the given function in the context of the web page. The execution is sandboxed, the web page has no access to the phantom object and it can't probe its own setting.github

それは困った。web

// 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();
  });
});

これは困った・・。ide

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通り。
推奨されてるのは最初のやつだそうな。ui

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(…

この方法で設定すると、最初の方法を上書きしてしまうそうです。lua

ログイン処理するならライブラリ併用が無難

參考:uu59のメモ | phantomjsでadplannerの表示を見るurl

ログインした後のリダイレクト待ちとか、そもそも重いページとか、単純なコールバックで上手くいかない時とか。
ここに書かれてる內容で、やりたいことのほとんどはできるのではないでしょうか。

あとはflow.jsとか。

參考:uupaa/flow.js · GitHub

ページへは、

if(!phantom.injectJs('./utils/jsdeferred.js')){
  console.log('This script requierd jsdefferred.js!');
  phantom.exit(1);
}

という具合で差し込めば使えます。

書式やスタイルはNode.jsと同じ

まぁ當たり前ですが・・。
コールバックの嵐になりがちなあたりや、CommonJSスタイルでのモジュール読み込みとか。

というかCasperJS

PhantomJSのAPIをいろいろ調べるとか、するより先に、コレ使ったほうが早いし楽です。
おそらくスクレイピング絡みのほとんどのことは、難なく実現できちゃいます。

CasperJSのメモとか、做ったサンプルはまた個別の記事で載せようと思います。

相關文章
相關標籤/搜索