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