casperjs を少し使ってみる

クジラ飛行机さんの 「JS+Node.jsによるWebクローラー/ネットエージェント開発テクニック」を
見ながら 少し勉強中
クローラーに興味あったけど、phantomjs ってどんな感じなんだろうと思ったのもあるかな?
もう少しサクサク進むかな と思ったけど 甘かった・・・
以下参考にしたサイト
gh640/captureLoggedInPages.js
CasperJSで動的ページをスクレイピング、あるいは毎月100円ゲットする方法について
CasperJSであしあとポイントをちょろまかす話のつづき
環境は Win10 Pro x64 + nodejs + phantomjs + casperjs
phantomjsからDLして、適当なフォルダに解凍して phantomjs\bin までpathを通す
> npm install -g phantomjs
> npm install -g casperjs
C:\Users\user_name\AppData\Roaming\npm\node_modules\casperjs\bin までpathを通す
phantomjs@2.1.7
casperjs@1.1.4
第3章 02 のサンプルを実行


> casperjs scraping.js

// 作詞掲示場のユーザー名とパスワード
var BBS_USER = "user_name";
var BBS_PASS = "password";

// CasperJSを使えるようにする
var casper = require('casper').create();
casper.start();

// 動作確認用
casper.on('url.changed', function(url){
this.echo("changed url=" + url);
});

// 動作確認用
casper.on('resource.requested', function(resource){
// this.echo("requested url=" + resource.url);
});

// 今回は使わない
casper.on('click', function() {
// クリックで発生したナビゲーションリクエストのURL
this.echo('on click event: request url=' + this.requestUrl);
this.then(function(response) {
// クリック後に行きついたページのURL
console.log('on click event -> then: current url=' + this.getCurrentUrl());
});
});

// 動作確認用
casper.on('navigation.requested', function(url) {
//this.echo('navigation.requested url=' + url);
});

// 作詞掲示板のログインページを開く
casper.open("http://uta.pw/sakusibbs/users.php?action=login");

// ログインする
casper.then(function(){
// フォームにユーザー名とパスワードを設定して送信
this.fill("form", {
username_mmlbbs6: BBS_USER,
password_mmlbbs6: BBS_PASS
}, true);
});

// サンプルにはないが追加しないと正常に動作しない
// post の後のページ遷移タイミング合わせ?
// このあたりについては 何が正しいのか要調査
casper.then(function () {
//console.log('Logged in');
});

// マイページを開く
casper.then(function(){
// マイページのURLを取得する関数を定義
var getLink = function () {
var q = document.querySelector('#header_menu_linkbar a');
return q.href;
};
// ページ内で評価
var mypage_url = this.evaluate(getLink);
this.echo("mypage url=" + mypage_url);
// マイページを開く
this.open(mypage_url);
});

// マイページのお気に入りを抽出する
casper.then(function(){
// お気に入りの作品を取得する関数を定義
var pickupFav = function () {
var res = [];
var q = document.querySelectorAll('#favlist li > a');
for (var i = 0; i < q.length; i++) {
var text = q[i].textContent;
var href = q[i].href;
res.push(text);
}
return res;
};
var res = this.evaluate(pickupFav);
// 結果を出力する
// utf8で出力されるが nodeモジュールが使えないので、このまま出力
this.echo("--- favlist ---");
for (var i = 0; i < res.length; i++) {
this.echo("- " + res[i]);
}
});

// 実行
casper.run();