casperjs を少し使ってみる
クジラ飛行机さんの 「JS+Node.jsによるWebクローラー/ネットエージェント開発テクニック」を
見ながら 少し勉強中
クローラーに興味あったけど、phantomjs ってどんな感じなんだろうと思ったのもあるかな?
もう少しサクサク進むかな と思ったけど 甘かった・・・
以下参考にしたサイト
CasperJSで動的ページをスクレイピング、あるいは毎月100円ゲットする方法について
環境は 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();