node.jsでhello world気分でスクレイピング2

前回は、環境構築+JQueryを使うための調べもので終わってしまいましたが、今回は、いろんなエンコードのサイトを取得して、utf-8に変換し、JQueryを使えるところまで作ります。
スクレイピングするにもまずはスタートラインにたたないとね。

処理を作る前に、iconvが必要なので、まずはその取得からです。

iconvのインストール

昔は、npm未対応だったみたいですが、現在はnpmに対応しているようです。
以下のコマンドでインストールできます。

npm install iconv-jp

自分は、これであっさり使えるようになりました(コンパイルしてたから、もしかしたら上手く動かない場合もあるかも)。

いろんなエンコードのサイトを取得して、utf-8に変換する処理

node.jsとjQueryでスクレイピングするウェブアプリの作り方 のコードをベースに不要なところを削って、v0.6.7のドキュメントみて、htmlの取得部分を書き換えました。
あとは、以下のサイトを参考にリダイレクトできるようにしました(短縮URLぐらいは処理できるようにした方がいいかと思って)。

node.jsでURLをGETしてファイルに保存する


そんな感じで作ったのが以下のコード。

// httpGet.js
var http = require('http'),
    https = require('https'),
    iconv = require('iconv').Iconv,
    url = require('url');

// Bufferを連結する
function concatBuffer(src1 /* , src2, ... */) {
    var i, buf, start;
    var len = 0;

    for (i = 0; i < arguments.length; ++i) {
        len += arguments[i].length;
    }

    buf = new Buffer(len);
    start = 0;
    for (i = 0; i < arguments.length; ++i) {
        var chunk = arguments[i];
        chunk.copy(buf, start, 0);
        start += chunk.length;
    }

    return buf;
}

// HTTPレスポンスとBufferからエンコーディングを検出し
// レスポンスボディを文字列で返す
function convertCharset(response, buf) {
    var charset = null;

    var content_type = response.headers['content-type'];
    if (content_type) {
        re = content_type.match(/\bcharset=([\w\-]+)\b/i);
        if (re) {
            charset = re[1];
        }
    }

    if (!charset) {
        var bin = buf.toString('binary');
        re = bin.match(/<meta\b[^>]*charset=([\w\-]+)/i);
        if (re) {
            charset = re[1];
        } else {
            charset = 'utf-8';
        }
    }

    switch (charset) {
    case 'ascii':
    case 'utf-8':
        return buf.toString(charset);
        break;

    default:
        var ic = new iconv(charset, 'utf-8');
        var buf2 = ic.convert(buf);
        return buf2.toString('utf8');
        break;
    }
}

exports.httpGet = function(targetUrl, callback) {
  var callee = arguments.callee;
  var chunks = [];
  var opts = url.parse(targetUrl);
  var req = (opts.protocol.match(/https/) ? https : http);
  req.get(opts, function(res) {
    if(res.statusCode == 301 ||res.statusCode == 302) {
        callee(res.headers.location, callback);
    } else if(res.statusCode == 200) {
      res.on('data', function (chunk) {
        chunks.push(chunk);
      });
      res.on('end', function () {
        var buf = concatBuffer.apply({}, chunks);
        delete(chunks);
        var body = convertCharset(res, buf);
        callback(null, body);
      });
    } else {
      callback(new Error('statusCode is ' + res.statusCode),null);
    }
    res.on('close', function (err) {
      delete(chunks);
      callback(err, null);
    });
  });
}

いろんなエンコードのサイトを取得して、utf-8に変換して、JQueryをつかるようにする処理

htmlを取得できるようになったので、次はJQueryです。
httpGet.jsを読み込んで、JQueryを使えるようにする感じにしました。

// httpGetWithJquery.js
// jsdomとjQueryのラッパー

var jsdom = require('jsdom/lib/jsdom'),
    httpget = require('httpGet');

// URLからリソースを読み込みjQueryを追加する
exports.getWithJqeruy = function(targetUrl,jquery_js, callback) {
    httpget.httpGet(targetUrl , function(err, body) {
        if (err) {
            if (callback) {
                callback(err,null,null);
            } else {
                throw err;
            }
        }
        var options = {};
        options.features = {};
        options.features.FetchExternalResources = false;
        options.features.ProcessExternalResources = false;
        var window = jsdom.jsdom(body, null, options).createWindow();
        jsdom.jQueryify(window, jquery_js, function(window, $) {
            // callbackを呼び出す
            if (callback) {
                callback(null, window, $);
            }
        });
    });
}

サイトを取得して、utf-8に変換してみる(動作確認)

動作確認に以下のようなコードを作成。

#!/usr/bin/env node
// clientTesthttpGet.js

httpGet = require('httpGet');

if (process.argv.length <= 2) {
    console.log('Usage: node clientTesthttpGet.js [url]');
    process.exit(1);
}
process.argv.forEach(function(val, index, array) {
  if (index >= 2) {
    httpGet.httpGet(val , function(err, body) {
        if (err) {
          console.log(err);
        }
        console.log(body);
    });
  }
});


以下のようにターミナルで実行します。

node clientTesthttpGet.js [取得したいサイトのurl]

いくつか試してみましたが、euc-jpのサイトも正常に変換されるし、短縮urlも上手く取得できました。



サイトを取得して、utf-8に変換し、JQueryをつかるようにしてみる(動作確認)


で、やっと目標だったJQueryを使ってみます。
動作確認用に、selectorを使ってテキストを取得する処理を作成。

#!/usr/bin/env node
// clientTesthttpGetWithJquery.js

var httpGet = require('httpGetWithJquery');
var jquery_js = 'https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js';

if (process.argv.length <= 2) {
    console.log('Usage: node clientTesthttpGet.js [url]');
    process.exit(1);
}
process.argv.forEach(function(val, index, array) {
  if (index >= 2) {
    httpGet.getWithJqeruy(val, jquery_js, function(err, window, $, body) {
        if (err) {
          console.log(err);
        }
        console.log($('.hatena-moduletitle').text());
    });
  }
});


以下のようにターミナルで実行します。

node clientTesthttpGetWithJquery.js [はてなブログのurl]


軽くためしてみましたが、きちんとselectorが機能してブログのタイトル取得できました。

これで、スクレイピングのするための準備はできましたね。
JQueryの力で、ごにょごにょすればスクレイピングし放題です。
まあ、JQueryでごにょごにょできればだけど(笑)。

node.jsでhello world気分でスクレイピング1

そろそろnode.jsさわってみようか、でも、hello worldだけじゃつまらないし・・・なんて思っていたところに、ちょうど作りたいスクレイピングが。。。
で、「よっしゃ、hello world気分でやってみっか!!!」
なんて思っちゃった時のメモ書きです。



インストール(Mac - v0.6.7)

  • google先生に聞くと、セットアップ方法がいろいろでてくるけど、今はインストーラーがあるみたいなんで、その方法でインストール
  • http://nodejs.org/ でダウンロードを押すとインストーラーを選択する画面がでてくるんで、Macインストーラー選んでダウンロード
  • ダウンロードしたら、普通に実行すればOK
  • インストールが終わったら、ターミナルで以下のコマンドを実行して、動作確認

node -v
npm -v


ちなみに、自分はnodeが0.67、npmは1.1.0-beta-10と出力されました。



jsdomのインストール

npm install jsdom

Qjsdomが/Users/hoge/node_modules/にインストールされたけど、大丈夫?

npmはコマンドを実行したカレントディレクトリにnode_modulesを作って、そこにモジュールを配置する仕様みたいです(昔は違った模様)。
で、node.jsは、requireしたとき、以下の順にモジュールを探しにいくっぽい。

  1. 動かしているjsと同階層にあるnode_modulesディレクト
  2. ルートフォルダまでさかのぼった場合にあるnode_modulesディレクト
  3. NODE_PATHとして環境変数に登録されているディレクト

今回は、/Users/hoge/source以下でプログラムを動かす予定なんで問題なし。


JQuery を使ってみる

ためしに、node.jsとjQueryでスクレイピングするウェブアプリの作り方 の「jQuery使ってみる」って箇所にあるコードを動かしてみます。
/Users/hoge/source/nodestudy/ にtest1.htmlとexam1.jsを作って、以下のコマンドを実行。

node exam1.js test1.html

2カ所ほどエラーがでいたので、調べてみるとrequireしているsysはもうなくなっていて、domtohtmlも場所が変わっているらしい。
とりあえず、sysをutilにjsdom/browser/domtohtmlをjsdom/lib/jsdom/browser/domtohtmlに変更

今後の教訓:他から持ってきたソースを動かして、requireでエラーが起きた時は、node_modulesの中と、node.jsの使っているバージョンのマニュアルをみる

ちなみに、修正して動いたソースは以下の通り。

#!/usr/bin/env node
// exam1.js

var util = require('util'),
    fs = require('fs'),
    jsdom = require('jsdom'),
    domToHtml = require('jsdom/lib/jsdom/browser/domtohtml');

var jquery_js = 'https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js';

// node、スクリプト名、の次に有効なコマンドライン引数が入る
if (process.argv.length <= 2) {
    util.puts('Usage: node exam1.js [FILE]');
    process.exit(1);
}

// HTMLコンテンツを読み込む
// コマンドライン起動前提なので同期I/Oで
var content = fs.readFileSync(process.argv[2], 'utf8');

// HTMLコンテンツからwindowオブジェクトを作る
var document = jsdom.jsdom(content);
var window = document.createWindow();

// jsdom.jQueryifyがwindowにjQueryを追加してくれる
jsdom.jQueryify(window, jquery_js, function(window, $) {
    // divを追加する
    $('body').append('<div>More Hello World!!</div>');

    // DOMツリーを出力する
    if (document.doctype) {
        util.puts(String(document.doctype));
    }
    util.print(domToHtml.domToHtml(document, true));
});

jsdom.jsdom() の script タグの処理を無効にして、jsdom.jQueryify()が動くかを確認

node.jsとjQueryでスクレイピングするウェブアプリの作り方 をみると、FetchExternalResourcesとProcessExternalResourcesをfalseにすると、jQueryify()が動かない、って書いてあるけど、バージョン違うだろうし、今も同じか確認してみたい。

というわけで、jsdom.jsdom() の script タグの処理を無効(FetchExternalResourcesとProcessExternalResourcesをfalseにする)にして、jsdom.jQueryify()を動かしてみます。

#!/usr/bin/env node
// exam1.js

var util = require('util'),
    fs = require('fs'),
    jsdom = require('jsdom'),
    domToHtml = require('jsdom/lib/jsdom/browser/domtohtml');

var jquery_js = 'https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js';

// node、スクリプト名、の次に有効なコマンドライン引数が入る
if (process.argv.length <= 2) {
    util.puts('Usage: node exam1.js [FILE]');
    process.exit(1);
}

// HTMLコンテンツを読み込む〓
// コマンドライン起動前提なので同期I/Oで
var content = fs.readFileSync(process.argv[2], 'utf8');

// HTMLコンテンツからwindowオブジェクトを作る
// FetchExternalResourcesとProcessExternalResourcesをfalseにして、
// JQueryが追加されないか確認(結果は追加される)
//var document = jsdom.jsdom(content);
var document = jsdom.jsdom(content, null, {
    features: {
        FetchExternalResources: false,
        ProcessExternalResources: false
    }
});
var window = document.createWindow();

// jsdom.jQueryifyがwindowにjQueryを追加してくれる
jsdom.jQueryify(window, jquery_js, function(window, $) {
    // divを追加する
    $('body').append('<div>More Hello World!!</div>');

    // DOMツリーを出力する
    if (document.doctype) {
        util.puts(String(document.doctype));
    }
    util.print(domToHtml.domToHtml(document, true));
});


こんな感じで、さっき動かしたexam1.jsを修正して、script タグの処理を無効にします。
そんで、以下のコマンドを実行

node exam1.js test1.html

結果は・・・



テスト


Hello, World!

んっ、"More Hello World!!"追加されてますね。


というわけで、今のバージョンだとFetchExternalResourcesとProcessExternalResourcesをfalseにしても
jQueryifyが正常に実行されて、JQuery使えるみたいです。


ふぅー、ぜんぜんスクレイピングできてないけど、今回はここまで。


以下は、nodeを軽く触った感想。




日々いろいろ変わってるのね。。。





ってか、ここにいたって、hello world気分ではじめた自分の甘さに気づきました(笑)。
1年たってないブログ記事でも、node.jsのバージョンが違ったりするし、モジュールなくなってたりするからそのまま動かないし。。。
気づくとググる時に1ヶ月以内って指定するようになるし、記事みつけても、結局は公式のドキュメントとソースを確認している自分がいます。。。
まあ、勉強になるし、楽しいからいいんだけど、軽い気分で始めた過去の自分には「バカ」といいたい(笑)。


スクレイピングするための課題

さて、スクレイピングまでたどりついていないので、残りの課題を片付けなくてはいけなんですが、あとは、いろんなエンコードのサイトをutf-8に変換できれば、jQueryifyでJQuery使いまくれる感じがしますね。
まっ、おいらはJQueryは初心者未満なんで、そっちも使いこなすところからはじめないとなんだけどね〜
(*´・ω・)(・ω・`*)ネー

そんなわけで、次はいろんなエンコードのサイトを取得して、utf-8に変換し、JQueryを使えるところまで作ります。
ここが「node.jsとjQueryスクレイピングするウェブアプリの作り方のソースをそのまま使います!以上!」
だったら良かったんですけど。
(そのまま使っていたら、ブログ書いていない可能性大ですがw)。

では、また次回。

2011年下半期ニコマス20選 〜kashisanの場合〜

卓球P主催のニコマス20選に参加します!

基本レギュレーション
・対象は2011年下半期(7月1日〜12月31日)に公開されたニコマス作品
・自身のセレクトを20作品以内でブログ及びマイリストにて公開
・1Pにつき1作品
※作品と一緒にP名を表記していただけると非常に助かります

20選参加は3回目ですが、あいかわらず、とってもライトな見る専です。
あ○○い先生がみたら「まるで成長していない・・・」って言われちゃう感じ。
ただ、前回の20選がきっかけで、ニコマスのブログをチェックするようになった、という変化がありました。
(具体的には、ニコマスブログを3サイト+続空の人のはてブを全部チェックするようになった)
なんで、前よりも知っていることが増えたかなぁ。
好みはかわってないけど。。。




まあ、そんな感じなんで書き方も変わりません。
前回同様キャッチフレーズ的なものをつけて、キャプチャ多めにはって、好きなところを書いていく形式。
あー、でも、作品を以下のテーマにわけたところは違うかな。
前回並び順とかも無駄に時間をかけてたんで、そこまでするならいっそテーマ分けしよう、ってことになりました。
(後ろの方は無理矢理分けてる感もありますが・・・)
ちなみに、テーマは以下の通り。

  • シンクロ
  • MMD
  • 新たな魅力
  • ネタ
  • 好み
  • 合作
  • 謎技術
  • ガチPV
  • VRF

前置きはそんな感じ。
それではスタート。





2011年下半期ニコマス20選





テーマ:シンクロ


 01 potechiP


  D


■○○賞
 明るい曲のシンクロに目覚めたで賞


■好きなところ
 個人的、今期MVP作品。
 これまでアイドルらしい明るい歌(AKBとかハロプロとか)でシンクロがきもちいい、って感じの動画が
いまいち好きになれなかったんですよ。
 なんで、これまではみんなの「これは楽しい」ってコメを共感できずに眺めているのがお決まりのパターンだったのですが、
 この動画はいっしょに楽しくなれました。
 「互換性なくても、無理矢理回路を開いて感性を目覚めさせるようなパワーがある」っていうか・・・って、
 これじゃあ何言ってるかわかりませんね(笑)。
 とくにかく、圧倒的な楽しさがこの動画にはあります。いやー、最高ですな。


■好きなシーン
 ぶっちゃけ、どこも好き、ちゅうか、どこにも隙がありません。
 なんで、とりあえず(σ・∀・)σ<DON'T STOP を4連発。
 20120109015702
 20120109015703
 20120109015705
 20120109015706
 あとは、美希のこのカットは印象にのこっているので、ペリっとな(他であんまりみないカットなんで、上手く使ってると思ふ)
 20120109015704



 02 ぎょP


  D


■○○賞
 ぎょP回転レコードとして語り継がれるで賞


■好きなところ
 サムネが印象的なぎょPの作品。
 明るいけどちょいアダルト風味の曲、丸春香さん、ダンスの合間にはさまれる静止画。
 自分がいままでもっていたぎょPのイメージとちょっと違う感じで、それが自分にはツボでした。
 もしかしたらこの動画は実験的な試みで単発の可能性もあるかもですが、
 「この方向でぎょPからさらに良い動画が生まれる可能性あるかも、ダンス以外の素材は十分すごいんで、
 ダンスと静止画の組み合わせ方をFRISKPあたりを参考にすれば、なんかすごい作品が生まれたり・・・」
 みたいな妄想もふくらみます。
 ・・・なんか、書いている内容が好きなところじゃなくなってきてる気がしますね(笑)。
 じゃあ、最後に一言。
 「自分好みの曲でみるぎょPのシンクロの破壊力、マジハンパないっす!!!」


■好きなシーン
 0:19〜0:36あたりの流れはすばらしい(同じ流れがもう1回あり)。なんで、スクショはそこらへんからいくつか。
 ここのスクショは「あー、ここらへんね」ってことだけ伝わればokということで。
 
 ここから
 20120109031255
 こう!
 20120109031256
 そしてセクシーダンス!
 20120109031257
20120109031258
 最後に丸春香さん。
 20120109031254




 03 透-架P


  D


■○○賞
 色あせないシンクロで賞


■好きなところ
 透-架Pが昔のスタイルのまま、Twinkle Snow Powdery Snowをリメイク。
 VRFで見た時には「うおぉー」ってなっちゃいましたが、この人のシンクロでどうにかなっちゃうのは人として正常です(キリッ
 まあ、透-架Pが今の画質で作品作ってくれるだけで、20選確定ぐらい好きなんで、客観的な評価じゃないかもですが、
 これはしょうがないですね。
 ちなみに、自分が、あまりエフェクトを使わないダンスとシンクロの動画が好きなのはだいたいこの人のせいで、
 神風Pとunder79を大好きなのも3分の1ぐらいこの人のせいです(笑)。


■好きなシーン
 透-架PのTwinkle Snow Powdery Snowとえいば、やっぱここでしょ。
 20120109150819
 こういうカットをみると画質よくなったことの恩恵を感じますね〜。
 20120109150820






テーマ:MMD


 04 F-san


  D


■○○賞
 スタンドマイク最高で賞


■好きなところ
 上半期にラフタイムPが歌と表情のシンクロみせてくれたけど、下半期はF-sanがMMDでみせてくれました。
 いやー、ダンスなしで、スタンドマイクで滔々と歌う、って発想で勝ちでしょ。
 まあ、発想だけじゃなくて、F-sanの技術も当然あるんですが(笑)。
 と・に・か・く、スタンドマイクには無限の可能性がある、と断言せざるえない(えっ)。
 「昔の歌番組で、特殊セットで歌っている感じがする。んっ、ってことはベストテンとかの
 再現、MMDでできたりするかな?・・・となると、いおりんが、爆風スランプの歌をスタンドマイクで
 はげしく歌ったり!!!」なんて感じに妄想も広がります(笑)。
 歌と表情のシンクロ好きなんで、もっと増えて欲しいですね(作るの大変なのかもしれないけど)。


■好きなシーン
 はるるんの横顔3連発。あえて、歌詞つきで!歌詞の入れ方も上手いよね。
 20120109164353
 20120109164354
 20120109164355
 最後に、正面から。このカット、スクショでみるとかなり強烈だと思うんだ・・・
 20120109164356




 05 オバンドーP


  D


■○○賞
 再現度ハンパないで賞


■好きなところ
 再現度がハンパない超絶モーション。元動画自体の楽しさもあり、すごく楽しい作品になってます。
 自分は元ネタ知らなかったので、比較動画みて、再現度に驚愕。
 あと、元ネタ、おっさんですが、それがかわいい女の子になると違った魅力が生まれますね(笑)。


■好きなシーン
 好きなところのスクショをペリっとな。
 20120109170232
 動きがわかるようにここはスクショを2つ。
 20120109170233
 20120109170234






テーマ:新たな魅力を表現


 06 アドP


  D


■○○賞
 真美に目覚めてしまうやろ!で賞


■好きなところ
 2で美少女グラに大変身した亜美と真美。
 良いグラなので「亜美と真美の2グラいいなぁ〜」なんて冷静に評価していたんですが。。。
 この動画は「真美 可愛い〜なぁ〜(*´∇`)」ってなっちゃいますた。うぅ、アドPに全面降伏です。。。
 ちゅうか、2:17ぐらいにある「にーちゃん」は強烈すぎだろJK。
 くっ、自分だけじゃなく、動画を見た人も巻き込んでしまうとは、アドP・・・恐ろしい子
 好きな理由は言うまでもないですが、「真美が可愛い」からです(キリッ


■好きなシーン
 というわけで強烈な「にーちゃん」のスクショ(声付きだと凄いんだ、これが)。
 20120109181519
 あと、美少女度満点のカット。真美 可愛い〜なぁ〜(*´∇`)
20120109181518



 07 さくやP


  D


■○○賞
 カッコいい雪歩だと・・・これはアリだな、で賞


■好きなところ
 雪歩のグラって1と2でそれほど変わっているわけじゃないけど「柔らかさを残しつつ、
 綺麗になった」と思ってます。
 その綺麗になった部分をいかして、カッコいい映像をつくったのがさくやP。
 レザードクィーン+2グラ雪歩だと、こんなカッコいい雪歩がみれることを教えてくれました。
 好きなところは、もちろん「雪歩のかっこよさ」。

 余談ですが、春香さんは2グラになって、圧倒的に可愛くなりました。
 可愛くなりすぎて、ダークな雰囲気の作品や、透明感のある美しさを表現する作品にあわなくなった、
 ように思います。
 この分野は貴音(と真美)がかなり持っていってるんじゃないかな。


■好きなシーン
 最高にカッコいい雪歩のカット
 20120109185851
 好きなところでは触れなかったけど、歌詞とシンクロしたこのカットもいいよね〜
 20120109185852






テーマ:ネタ・ストーリー


 08 なするなP


  D


■○○賞
 これぞニコ動で賞


■好きなところ
 秀逸なネタと気が利いたコメントの数々。これぞニコ動の楽しさですよね。
 ほんと楽しませてもらいました。
 もちろん、わたkashisanはXenon(ゼノン)初期型のもっさり感が好きですよ(のヮの


■好きなシーン
 Jasper(ジャスパー)あたりのコメが一番好き。
 スクショいらないかもだけど、1枚だけ。
 Xenon厨乙といわれようと、Xenon(ゼノン)初期型のはるるんこそ至高といわざるおえない(キリッ
 20120109193523




 09 すっきりぽんP


  D


■○○賞
 甘酸っぱい記憶が蘇るで賞


■好きなところ
 あざとい!卑怯だ!って叫んでしまうぐらいニヤニヤっとする文章満載。
 こんなんストライクにきまってる、えぇ、何度ニヤニヤしたかわかりませんがな。


■好きなシーン
 シーンっていうか、文章になるんだけど、選びたいところが多すぎて、どうしよう状態。
 とりあえず、厳選して2つだけ。
 やっぱ、この導入は秀逸すぎるでしょう。
 20120109202740
 あと、こういった心理描写がこれぐらいの年齢のリアルな感情を思い起こさせる。いや〜、いいっすね〜
 20120109202741






テーマ:好み


 10 ハニハニP


  D


■○○賞
 まっこまっこにされたで賞


■好きなところ
 かっこいい真の映像が自分は好きみたいで、気がつくと20選に。
 無意識のうちに真枠用意してる疑惑が(笑)。
 でも、音源がすごい、ってのもあるけど、かっこ良すぎるからしょうがない。
 ちなみに、「まっこまっこにされたで賞」は2期連続となりました。


■好きなシーン
 最初のこのシーン。この時点でもうキターってなります。
 20120109210406
 あとは、静止画で生えるこのカットをチョイス。2:24〜2:25あたりに一瞬だけ入るんだけど、絵の素晴らしさもあって効果的だと思う。
 20120109210405




 11 ブラッキーP


  D


■○○賞
 中毒性が高いで賞


■好きなところ
 この曲とスノーフレークリリパットの雪歩をあわせた時点で勝ちです(キリッ
 いやー、これは中毒性高い。
 画面の切り替えがうまくて効果的なんだろうけど、理屈じゃない感じ、
 これはハマります。
 

■好きなシーン
 印象的なサビから1ショット。サビはいろいろいいのがあって選べないほど。
 20120109213254
 あとは、個人的に印象に残ったシーンを1つ。サビの直前にこのカットがあるんだけど、
 1:20あたりから始まるここからサビの流れが凄いイイ。
 20120109213253






テーマ:合作


 12 合作(お茶P、しょじょんP、ちゃたまるP、はしP)


  D


■○○賞
 センスの固まりで賞


■好きなところ
 とりあえず、センスがいい、っておきまりの文句で紹介しちゃいましたが、
 合作ということもあって、いろんな良さがあるわけですよ。
 なんで、どこらへんが好きかは、スクショを多めに貼って補完しますよ、っと。
 

■好きなシーン
 ちょっとぼかした感じでエフェクトかけてるこのシーン。あかるく、さわやかで素敵。
 20120109215247
 ロングで仲良さそうにしているシーンもいい。
 20120109215248
 ここが一番印象に残ってるかも。こういうやよいおりの表現もありですな。
 20120109215249
 4人のアップ。ロングとアップを効果的に使っているのもこの動画の特徴かも
20120109215250
 そして、このカラー。
 20120109215251
 このショットもすごい。
 20120109215252
 このショットもすごいからのこれ!
 20120109215253






テーマ:謎技術


 13 uhhoP


  D


■○○賞
 ベストシーン賞


■好きなところ
 いろいろ人がこの動画に言及してるので、書きづらいですね。
 なんで、感想は「この動画が見れてよかった。」「例の衝撃的なシーン(好きなシーン参照)は、
 当然「おぉー」ってなりました」ぐらいで。
 あとは、上半期20選に選んだRed fractionも口元が印象的だったんですが、この動画も
 リップシンクロ重視にみえました。uhhoPのそういった動画作りが好みみたいです。
 

■好きなシーン
 ベタですが、例のシーンのスクショ貼ります。
 20120109221004
 20120109221007
 20120109221005
 20120109221006




 14 けまり部P


  D


■○○賞
 驚愕の再現度で賞


■好きなところ
 アニマス素晴らしかった。そして、どちらのOPも素晴らしかった。
 そして、けまり部Pの動画も素晴らしかった!


■好きなシーン
 これは可愛い!
 20120109224528
 ここの再現すごいよね。
 20120109224530
 そして、全員がステージに。さすがけまり部P!!!
 20120109224529






テーマ:ガチPV


 15 えびP


  D


■○○賞
 例の赤い線で賞


■好きなところ
 この作品もいろんな人が記事書いてるから書きづらいな。。。
 素直に「赤い線をきるシーンが好き」とだけ。
 あとは・・・こういった雰囲気はやっぱり1の春香さんならではだよなぁ、
 って、えびPのこの動画をみて強く思いました。


■好きなシーン
 例の赤い線のシーンをペリっと。
 20120109225906
 20120109225907




 16 りんごP


  D


■○○賞
 もうなにがなんだかわからないで賞


■好きなところ
 ここまでいくと、もう何をかいていいやら。
 圧倒的な映像美で、開いた口が塞がらない。
 うー、ここは20選エントリで3回まで許されているという「ともかく動画みてください」
 を使います(キリッ


■好きなシーン
 何を貼ればいいかすら・・・
 とりあえず、動画のイメージがわかる黒と蛍光の緑を基調としたショットを1枚
 20120109231609
 あと、春香さん。
 20120109231610
 最後にののワさんを
 20120109231611






テーマ:VRF(11年デビュー)


 17 神風P


  D


■○○賞
 3度目の神風は吹いたと思うで賞


■好きなところ
 VRFで真センターの動画が終わり、美希がセンターでさらに新作!!!
 しかも、この出来。終わった後は「かっみかぜ!!!」コールしてました。
 ガルシアPの20選で、「時間まで支配した」という感じの感想が書かれていたのですが、
 すげー的確な表現ですよね。
 好きなシーンの神風マジック2はその最たるもので、自分はここが一番しびれました。


■好きなシーン
 神風マジック1
 20120109234849
 20120109234850
 20120109234851
 神風マジック2 これは特に凄い!
 20120109234852
 20120109234853


 18 crongP


  D


■○○賞
 DOPING P@ND@のメドレー動画全部入りがあって助かったで賞


■好きなところ
 アイドルマスター2 『Hi-Fi』とアイドルマスター2 『Can't Stop Me』どちらを選べば、
 という状態だったんだけど、VRFみて迷わずこれに。
 crongPは、音楽とダンスの組み合わせがすごい気持ちいい!!!
 ほんとクセになりますよね。


■好きなシーン
 この手を広げるところが好き!
 20120110020851
 チャチャッ、チャチャッ♪
 20120110020852
 アッ♪
 20120110020853
 あいらーびゅー♪
 20120110020854
 あとは、真のかっこいいショットを
 20120110020855


テーマ:VRF


 19 うしわかP


  D


■○○賞
 ハローグッパイも賞


■好きなところ
 ハローグッパイも♪気がつくと口ずさんで、映像が浮かんでくる。
 うしわかPの動画って、すごいインパクトで一気にもっていくわけじゃなくて、
 気がつかないうちに心をがっちりつかまれる感じです。
 サビのダンスも全部違んじゃないか、ってぐらいいろんなの使ってたり、
 ここでコレ?って動きも普通にとけこましてしまったり(ちなみに1:04)、
 ほんとすごいと思います。
 なんなんでしょうね、この雰囲気、空気感・・・まあ、最高であることだけは
 わかりますが(笑)。


■好きなシーン
 スタートの淡い映像。こういった入りがあの雰囲気を作り出しているのかな?
 20120112002137
 スタートの元気なダンス。楽しげな気持ちになります。
 20120112002138
 一番好きな箇所。ここから。
 20120112002139
 ネクタイのアップ。なんでこれがいい、って感じてしまうかわからないけど、すごいイイ。
 20120112002140
 3:40あたりにある、振り返ってからのウインクもイイ
 20120112002141
 1:04あたりのここでコレ?って箇所もいちおうペリっと。ここに違和感を感じないのがほんと謎。
 20120112002142


 20 FRISKP


  D


■○○賞
 伝説になったっで賞


■好きなところ
 FRISKPってアイマスのダンス使わなくても、すごいイイ絵を使える人だと思います。
 でもう、ここでスクショはってしまいますが、こんな絵を作られたらもうダメですよ。
 20120112005548
 この絵が、曲にあわせて、すごい気持ちいいタイミングで、入ってきて、
 その絵にいるアイドルがこの後出てくるわけですよ。
 そんなのスゲーいいに決まってるじゃないですか。
 「●▲■×」みたいな繰り返しの気持ち良さ+「Crazy」みたいな映像美が融合した印象で、
 個人的にはすごい贅沢。
 あとは、「なんかすごい人になっちゃったなぁ」ってみたVRFでみた瞬間思いました。
 

■好きなシーン
 例の絵に春香が。そりゃあ、いいに決まってます
 20120112005549
 この繰り返しも強烈だった。なんだよ、この白い線。カッコよすぎるじゃないか。
 20120112005550
 ここで、真の手がとまるような感じスゲーよかった。
 20120112005551
 例の絵に真もカッコいい。
 20120112005552
 最後のこの絵はよかったなぁ。。。
 20120112005553

2011年上半期ニコマス20選 〜kashisanの場合〜

卓球P主催のニコマス20選に参加します!

基本レギュレーション
・対象は2011年上半期(1月1 日〜6月30日)に公開されたニコマス作品
・自身のセレクトを20作品以内でブログもしくはマイリストにて公開
・1Pにつき1作品
・選考基準はフリー(お気に入り・埋もれ発掘・テーマに沿って等何でもオッケー)


見る専なんで、技術的なことはよくわからないので、どういうところが好きかに焦点をしぼって書いてみました。
あとは、工夫なんだか、おやじギャグなんだかわからないキャッチフレーズ的なものも(笑)。




それでは、スタート!




2011年上半期ニコマス20選






01 RidgerP


  D


■○○賞
 さすがは王で賞


■好きなところ
 さすが王は格が違ったとしか言いようがない。
 『貴音さんがかっこいいんだが・・・』と悩んだけど、やっぱり本気モードのこちらをチョイス。


■好きなシーン
 0:43 真が一瞬登場するシーン
 20110708000744
1:18 美希が体を揺らすシーン
 20110708001849
 1:27 美希が両手で指さすシーン
 20110708003529








02 ぽP


  D


■○○賞
 オシャレなカットにやられたで賞


■好きなところ
 すごいオシャレなカットがところどころにでてきて、それにやられる。。。
 動いているところより止まっている絵の方が印象的で、そのチョイスがすごい好き


■好きなシーン
 0:35 春香がメガネをかけるシーンはすごいオシャレ
 20110708005204
 0:38 春香が勝ち誇ったような顔もいい
 20110708005205
 2:25 あたし芸能人です、って感じのプライベート映像は新鮮
 20110708005206







03 TiltP


  D


■○○賞
 弾幕美しすぎるで賞


■好きなところ
 全体的に美しい動画なんだけど、やっぱ弾幕のシーンはすばらしい。


■好きなシーン
 2:01 弾幕美しいっす。もちろんシンクロしている春香さんも音楽も
 20110710100344
 20110710100345
 3:42 魔法円と閣下美しい・・・
 20110710100346
 5:42 手をキュッ
 20110710100347







04 GたまP


  D


■○○賞
 Bad Apple よりこっちで賞


■好きなところ
 お金をかけた歌番組のロケみたいな雰囲気が最高。
 あと、アスファルトにうつる影も好き。
 (凄い好きな動画なのに、20選の投票少なすぎて悲しひ)


■好きなシーン
 1:10 (わた)しの〜♪
 20110709113331
 3:43 の〜♪
 20110709113332








05 アワビP


  D


■○○賞
 フリーザ様が素敵すぎて反則すぎるにもほどがあるで賞


■好きなところ
 この歌をフリーザ様に歌わせるという発想が天才すぎ。
 美声なフリーザ、マジイケメン。
 もちろん、伊織も素敵ですよ。


■好きなシーン
 0:01 フリーザ様の美声、マジ素敵w
 20110709115815
 2:17 フリーザ様の高音、マジセクシー
 20110709115816







06 アキノP


  D


■○○賞
 ライブ感最高でやよいのドラムがかっこよすぎで賞。


■好きなところ
 全部がすごいんだけど、やっぱりやよいのドラムが最高。
 真美の横顔もいいけど。
 MMDの演奏系はすごい好きなんで、今後もこのレベルの作品がでてくることを期待。


■好きなシーン
 0:33 春香と真美の横顔がすごいいい。MMDということを感じないレベル
 20110709095813
 1:54 ピタッ!
 20110709095814







07 ぷっつんP


  D


■○○賞
 すてきなさよならとすてきなハロー、愛にあふれすぎているで賞


■好きなところ
 あふれる愛、以上!!!


■好きなシーン
 1:58 ランキングを壊すシーンは「おぉー」って感じ
 20110709121651
 20110709121652
 20110709121653
 3:50 ここから始まる巡り会うよベイビイでセイハローなシーンはいいよね
 20110709122712







08 神風P(神人)


  D


■○○賞
 デビュー作で頂点にのぼりつめたかもしれないで賞


■好きなところ
 衝撃のデビュー作。
 デビュー作にして、RidgerPやorgonePの動画をみているような感覚。
 なんかもう凄すぎて、なんといったらいいかわからないんで・・・
 まあ、そういうことで(動画をみている人なら伝わる・・・はず?)。


■好きなシーン
 全部が好きなんで選べないんだけど、あえて一つ選ぶなら・・・

 4:22 雪歩が翼を広げ、世界を廻ったら、美希と真が登場したシーン
 20110709101615
 20110709101616
 20110709101617
 20110709101618







09 ラフタイムP(新人)


  D


■○○賞
 脅威のリップシンクロで賞


■好きなところ
 リップシンクロにつきます。おそらく、音楽にあわせて口を編集と思うので、厳密にはリップシンクロといわないのかもしれませんが、
 スローな曲にあわせて、歌いだす春香さんは「おー」って感じです。


■好きなシーン
 0:14 春香が歌いだすシーン。ここ最高
 20110709092035
 2:45 でも、春香が目を閉じて「きざんで〜♪」もいい。まあ、同じ顔という噂もある(笑)
 20110709092036







10 れぐみんP(新人)


  D


■○○賞
 タイトル反則だけど、中身も反則で賞


■好きなところ
 おいしそうなところ、ではなく、明るくてかわいい雰囲気。
 とにかくコミカルで素敵!


■好きなシーン
 0:12 千早が( ゚3゚)ピュピュピューイピュピュピュー
 20110709094330
 0:17 真が( ゚3゚)ピュピュピューイピュピュピュー
 20110709094331
 0:27 美希が・・・以下略
 20110709094332







11 ジャパネットP=やまねこ氏(新人)


  D


■○○賞
「おまえのような新人がいるか」にもほどがあるで賞


■好きなところ
 職人系の神人さんで、3DCGのキャラのデキがはんぱない。
 

■好きなシーン
 0:05 亜美がローディングうたいだして、唖然とさせられるところ
 20110710101850







12 影彦P(新人)


  D


■○○賞
 やわらかいひかりにつつまれる感じで賞


■好きなところ
 選曲とそれにあわせた動画全体の雰囲気、色使いがとても印象的。
 曲の雰囲気から動画をイメージして作っているように感じられるPで、
 この人でしか表現できないような動画に期待。
 っていうか、この歌にこの背景で雪歩にこの衣装・・・チョイス完璧すぎ。
 あと、目立たないけど、シンクロもかなりのレベルで、とくにリップシンクロに
 かなり気を使っているように思う。
 スタートはシンクロ重視で、後半は演出重視という構成も個人的に好印象。
 透明感がある青と、淡い青とピンクの暖色系の色の使い分けも印象深い。
 使い分けに規則性はないように見えるので、感性で選んでいると思うんだけど、
 歌とすごいマッチしていると思う。
 

■好きなシーン
 0:15 透明感のある青の色を基調とした色合いから淡い青を基調とした色合いへ
 20110710121101
 20110710121102
 1:34 「 」、ここにこの絵を差し込める感性はすばらしい
 20110710121103
 1:56 前半のサビは青系でまとめていたけど、後半はピンクをメインに多彩な色彩。画像は、ファーストマジック♪のところ
 20110710121104






13 よりみちP


  D


■○○賞
 capsulemにピンクの衣装、シンクロ完璧は卑怯で賞


■好きなところ
 完璧すぎるシンクロとcapsulemとピンクの衣装の組み合わせにつきます。
 蜂Pの『雪歩×capsule「music controller(piconova-mix)」』(sm2966263)にやられて以来、
 この組み合わせに弱いんですよ。。。
 1分すぎたあたりから始まる脅威の長まわしと、まったく不自然な箇所がない完璧なシンクロ。
 この組み合わせは最強!
 メインは5人のダンスですが、要所にもってくるやよいのアップは反則(笑)。


■好きなシーン
 0:07 完璧なシンクロでスタートして、ここでアップでやよいがわたわた。しょっぱなから強烈なつかみ、これ反則(笑)
 20110710124636
 1:16 やよいがアップで人差し指を口元にあててからのシーン。もちろんこれも反則(笑)
 20110710124637
 20110710124638






14 うしわかP


  D


■○○賞
 原点すぎる、王道すぎるで賞


■好きなところ
 「想いが伝わるように」という投稿コメがジーンときた作品。
 やわらかい色彩の中、前向きな曲を明るい笑顔のアイドル達が手を取り合って歌う、
 ストレートですばらしい作品です。


■好きなシーン
 1:42 ここの雪歩のシンクロが地味に凄い
 20110710142814
 20110710142815
 2:15 手を取り合ってフライハイしたら衣装変わったでござるのシーンやっぱりいい
 20110710142816
 20110710142817






15 ブイヒサP


  D


■○○賞
 まるで絵本のようで賞


■好きなところ
 アイドル抜きでも人を引きつける魅力がある映像を作れるブイヒサP。
 アイドルの顔が2分以上でてこないというチャレンジングなことをやっているんだけど、
 まったく無理がない。
 ある意味、幻想的な映像を作れるブイヒサPの本領が余すところなく発揮されている作品。
 「ブイヒサP、マジニコマス界の絵本作家」です。


■蛇足
 最強借り物P(by オレオレランキング)。
 FRISKPは「誰かキャプチャ環境を彼に!」って思うけど、ブイヒサPはそういう風に思わないというのが
 ブイヒサP最強説の根拠です(笑)


■好きなシーン
 2:02 2分をすぎて、はじめていおりん顔出し(専門用語で、「いおりんの顔出し、マジ日照」という・・・らしい)
 20110710131849
 20110710131850
 2:51 ブイヒサP、いろんなオブジェクトこれでもか、ってのせる時あるんだけど、それがすばらしいバランスな絵になる例1
 20110710131851
 3:11 ブイヒサP、いろんなオブジェクトこれでもか、ってのせる時あるんだけど、それがすばらしいバランスな絵になる例2
 20110710131852






16 under79


  D


■○○賞
 まっこまっこにされたで賞


■好きなところ
 カメラワークとダンスシンクロが気持ちよすぎる。
 このシンクロはとにかく最高。
 2でイメージが変わった真の新たな魅力を表現しているところもポイント凄く高い。


■好きなシーン
 0:01 歌詞とシンクロしてる真の涙いいっす
 20110710112341
 0:10 うぉぉぉぉぉぉぉ〜、これが『まっこまこにされる』ってことか〜
 20110710112342
 0:35 未来をえがいた〜♪のシンクロすばらしい
 20110710112343
 0:58 「けっせない」の「け」の表情
 20110710112344
 1:19 「さびしくて」の「て」の表情
 20110710112345
 2:25 個人的、この動画最大の見所。2の新しい真の魅力を引き出すすばらしいカメラワーク
 20110710112346
 20110710112347
 20110710112348 







17 そいP


  D


■○○賞
 雰囲気にひきこまれるで賞


■好きなところ
 なんていったって雰囲気が好き。
 で、なんとなくだけど、この雰囲気を生み出しているのは背景なんじゃないかな、
 って思っている。
 うまくいないけど、アイドルと音楽のシンクロで雰囲気を作るというより、音楽と背景の
 組み合わせで意図通りのものにしている印象。
 まあ、宇多田の曲と雰囲気がとてもマッチしている上に、ストーリー性までもりこまれたら、
 降参するしかない。
 あと、好きなシーンにもあげた0:10と0:30の背景は秀逸だと思ふ。


■好きなシーン
 0:10 赤を基調とした背景にたたずむ雪歩。曲とこの風景がシンクロして・・・ここでもってかれます
 20110708020912
 0:30 オシャレな服が飾ってあるショーウインドウの背景が素敵
 20110708020913
 1:27 ショーウインドウ真版。真が着たら似合いそうな服を背景にたたずむ感じがすばらしい
 20110708020914
 3:44 2回目の雪歩が飛び立つシーンは、翼が消えていく・・・こういう演出好きです
 20110708020915






18 uhhoP


  D


■○○賞
 ロベルタ律子の幻影がみえないほど、見せ方がかっこ良すぎるで賞


■好きなところ
 中盤にかけて多用している口元のメインのカメラワーク。
 とにかくカッコいい。ここらへんがセンス何だろうと思う。
 あと、ロベルタ律子という強烈なイメージがあるのに真っ向から立ち向かう度胸。
 最初こそ、その手のコメがあるものの中盤以降はその手のコメがまったく見当たらない。
 作品で黙らせてしまっている感じがカッコイイ。


■好きなシーン
 0:31 いおりんが指をクルクルするところでもってかれる
 20110710133859
 1:02 貴音が手を交差するシーン。曲とシンクロしてカッコいい
 20110710133900
 2:39 ここからはじまる真のダンスシーンがエロカッコいい(2の真ならでは)。個人的にこの動画最大の見所
 20110710133901







19 艦長P


  D


■○○賞
 最高の疾走感、シンクロ気持ちよすぎるで賞


■好きなところ
 速いテンポの曲に高いシンクロ、そしてカッコいい映像。
 高速シンクロで爽快スッキリ、すばらしい高速m@sterを堪能できます


■好きなシーン
 高速シンクロを堪能する作品なんで、好きなシーンを静止画で選択するのは難しい。
 なので、絵になるスクショもまぜてみた。

 0:11 数少ない止まった状態で見せるシーン(出演者紹介的な感じ?) その1
 20110710145831
 0:16 数少ない止まった状態で見せるシーン(出演者紹介的な感じ?) その2
 20110710145832
 1:42 同じようなシーンは2回あるんだけど、2回目は畳み込む感じがすばらしい
 20110710145833







20 orgoneP


  D


■○○賞
 異次元すぎるで賞


■好きなところ
 一言でいうと、異次元のデキ。
 この動画が好きというか、なんかもうすごすぎて圧倒される。唖然とする完成度、
 あいた口がふさがらない、わけがわからないよ、と、まあ、こんな感じ。


■好きなシーン
 ほぼ全部が圧巻ですが、それでも強いてあげるなら・・・って選んだけど、伝わる気がしない(笑)。
 まあ、実物みましょう、ってことで。



 0:15 序盤口元より上を出さないで、ここで視線が・・・ゾクッってくる。
    この作品は黒を基調とした色彩(と光)が素敵
 20110710143327
 2:08 いおりんとあみまみが首をかしげるところが、地味に好き
 20110710143328
 2:27 ここからアイマスのキャラが次々と入れ替わっていくシーンは異次元としか
   (画像だと上手く伝わらないのでスクショなし)

gasでアイマス20選をスクレイピングしてみた

gasをスクレイピングしてみたら便利だったりするかな、と思いたったのでやってみた。
ネタはニコマス20選。


ニコマス20選とは・・・


えー、半期に一度、以下のレギュレーションで好きなアイマス作品を選ぶイベントがあるですよ。

基本レギュレーション

  • 対象は2011年上半期(1月1 日〜6月30日)に公開されたニコマス作品
  • 自身のセレクトを20作品以内でブログもしくはマイリストにて公開
  • 1Pにつき1作品
  • 選考基準はフリー(お気に入り・埋もれ発掘・テーマに沿って等何でもオッケー)


詳細は、こちら参照


で、まあ、20動画を選んでマイリストかブログのアドレスを以下のエントリーサイトのコメントに登録していくわけですが、それをスクレイピングしてみようというわけです。

エントリーサイト
http://onsentackq.blog31.fc2.com/blog-entry-354.html

htmlをみてみるとブログをスクレイピングするのは厳しいそうなので、まずはマイリストを対象にデータを取得してみようと思います。

で、VBA感覚で書いたのが以下のコード。

function getImasSelect20Data(){

  //2011年上半期のエントリーブログのurl
  var url = "http://onsentackq.blog31.fc2.com/blog-entry-354.html";
  //2010年下半期のエントリーブログのurl
  //var url = "http://cryptos.jp/archives/973";

  //シートを追加
  var today = new Date();
  var yesterday = new Date(today.setDate(today.getDate()-1)+14400000);   //日本時間より4時間前の時刻がとれるので時間を調整
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  ss.insertSheet("2011年上半期ニコマス20選エントリー " + yesterday.getFullYear() + "/" + (yesterday.getMonth()+1) + "/" + yesterday.getDate(), 1);

  //ブログのhtmlを取得
  var response = UrlFetchApp.fetch(url);
  var blogHtmlStr = response.getContentText();

  //mylist分のデータを取得
  var select20MylistData = getMylistData(blogHtmlStr);

  //ブログ分のデータを取得(あとで処理を作れたらいいなぁ)
  //var select20BlogData = getBlogData(blogHtmlStr);

  //mylistとブログのデータを結合
  var select20data = select20MylistData;

  //スプレットシートに出力
    var range= SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange(1, 1);
    for ( var i = 0;i<select20data.length ; i++ ){
      range.offset(i+1, 0).setValue(select20data[i].userid);
      range.offset(i+1, 1).setValue(select20data[i].infodate);
      range.offset(i+1, 2).setValue(select20data[i].nicolink);
      range.offset(i+1, 3).setValue(select20data[i].title);
      range.offset(i+1, 4).setValue(select20data[i].nicomemo);
    }
}

/**
 * htmlテキストからmylstのURLを取得して、動画情報のリストを取得する
 * @param htmlstr {String}
 * @param url {String}
 * @return mylistData {Array}
 */
function getMylistData(htmlstr) {

  //mylistのRssのアドレスリストを取得
  var mylistRssUrlList = getMylistRssUrlTakyuPBlog(htmlstr);

  //取得したリスト分処理を実施
  var mylistData = new Array();
  for( var i = 0; i<mylistRssUrlList.length ; i++ ) {

    //mylistのrssのhtmlデータを取得
    try {
      response = UrlFetchApp.fetch(mylistRssUrlList[i]);
    } catch(e) {
      //MyListが取得できない場合(削除されている場合など)は処理を飛ばす
      continue;
    }
    htmlstr = response.getContentText();

    //useridの抜き出し
    var userid = htmlstr.match(/<dc:creator>.+<\/dc:creator>/g);
    userid = userid.join().replace(/<dc:creator>/g,'').replace(/<\/dc:creator>/g,'').split(",");

    //動画のメモを抜き出し
    var nicomemo = htmlstr.replace(/\n/g,'').match(/<p class="nico-memo">.+<\/p><p class="nico-thumbnail">/g);
    if(nicomemo){
      nicomemo = nicomemo.join().replace(/<p class="nico-memo">/g,'').replace(/<\/p><p class="nico-thumbnail">/g,'').split(",");
    }
 
    //動画のlinkを抜き出し
    var nicolink = htmlstr.match(/<link>http:\/\/www.nicovideo.jp\/watch\/sm\d{8}<\/link>/g);
    nicolink = nicolink.join().replace(/<link>http:\/\/www.nicovideo.jp\/watch\//g,'').replace(/<\/link>/g,'').split(",");

    //動画内のタイトルを抜き出し
    var title = htmlstr.match(/<title>.+<\/title>/g);
    title = title.join().replace(/<title>/g,'').replace(/<\/title>/g,'').split(",");

   //動画の投稿日時を抜き出し
    var infodate = htmlstr.match(/<strong class="nico-info-date">.+<\/strong>/g);
    infodate = infodate.join().replace(/<strong class="nico-info-date">/g,'').replace(/<\/strong>/g,'').split(",");

    //取得したデータ配列に追加(タイトルだけよけいなデータがとれてる・・・ださいけどここで吸収)
    for ( var j = 0;j<nicolink.length ; j++ ){
      var nicodata = new Object();
      nicodata.userid = userid;
      nicodata.infodate = infodate[j];
      nicodata.nicolink = nicolink[j];
      nicodata.title = title[j+1];
      nicodata.nicomemo = "";
      if (nicomemo) {
        if (nicomemo[j]){
         nicodata.nicomemo =  nicomemo[j];
        }
      }
      mylistData.push(nicodata);
    }
  }
  return mylistData;
}

/**
 * 卓球PのブログからマイリストのURLを抜き出し、RSSのURLに加工したリストを返す
 * @param htmlstr {String}
 * @return mylistRssUrl {Array}
 */
function getMylistRssUrlTakyuPBlog(htmlstr){

  //mylistのアドレスを抜き出し
  var mylistUrl = htmlstr.match(/<a href="http:\/\/www.nicovideo.jp\/mylist\/\d{8}" target="_blank" title=/g);

  //不要な部分文字を削除し、rssのURLに編集
  var mylistRssUrl  = mylistUrl.join().replace(/<a href="/g,'').replace(/" target="_blank" title=/g,'?rss=2.0').split(",");

  return mylistRssUrl;

}

/**
 * ぎょPのブログからマイリストのURLを抜き出し、RSSのURLに加工したリストを返す
 * @param htmlstr {String}
 * @return mylistRssUrl {Array}
 */
function getMylistRssUrlGyoPBlog(htmlstr){

  //mylistを抜き出し
  var mylistUrl = htmlstr.match(/<a href="http:\/\/www.nicovideo.jp\/mylist\/\d{8}" rel="nofollow">/g);

  //不要な部分文字を削除し、rssのURLに編集
  var mylistRssUrl = MylistUrl.join().replace(/<a href="/g,'').replace(/" rel="nofollow">/g,'?rss=2.0').split(",");

  return mylistRssUrl;

}


ちなみに、上記の処理を実行した結果はこんな感じ(ヘッダだけ手で追加してます)

https://spreadsheets.google.com/spreadsheet/ccc?key=0Ao_xgV3iKKtddE9ES0U2dzkyTkExQVdXVExzUmtLLVE&hl=ja


gasでスクレイピングしてみて

  • 正規表現でマルチバイト文字を上手く扱えないのが残念。アスキーコードで指定すれば動くかもしれないけど、めんどくさいので試してません
  • トリガー使って時間指定で起動できるのが便利
  • 作ったデータをいろんな形式でダウンロードできるのは便利
  • なんかのサービスからデータを利用しようとすると、めんどいかも(gdataAPIを使う必要がある?)
  • Yahoo Pipesみたいに、文字が多くてエラーになるようなことがないので便利。ページの文字数が多いものをスクレイピングするにはおすすめかも?


20選的な視点で

  • 動画のIDでフィルタかけて、特定の動画のコメントみるのはなかなか楽しい
  • ブログでのエントリーなくして、マイリストオンリーだとデータ取得で楽できるかも、って感じた
  • マイリスト限定にしても、サムネ1選のデータが混じるので、別エントリで別マイリストだともっといい(笑)
  • ここから集計しようとすると、標準版と高画質版を集約したり、シリーズものを集約したりする必要があるので置換リストが必要になりそう
  • ブログのエントリーのスクレイピングはいばらの道な感じ。それぞれ処理かかないとダメそう。コメントはあきらめて、動画のIDだけ取得するならできるかもだけど
  • 2010年下半期も試しに取得してみたけど、マイリストを削除している人が多くて全部のデータとれなかった。締め切り直後に取得することと、集計後削除する人もいるかもしれないから、日々の履歴も念のためあった方がいいかなぁ、って思った

kanonをmacへインストールしようとしてみた3

ちょっと間があいたけど、pythonの環境周りのエラーをみていきます。
いろいろ確かめる前に、portでpython_selectをインストールして、python26を選択しておきました。
これが効果があったか不明ですが、やっておいた方がよいかな、って思います。

で、前回の続きですが、とりあえず、エラーメッセージをみるとだいたいこんなことをいってます。



エラーメッセージのお言葉
  • Python egg cache directoryに解凍しようとしている時におちてるよ
  • そのディレクトリ(/var/opt/kanon/trac/)に書き込み権限がないから、落ちているんじゃないかな
  • PYTHON_EGG_CACHE って環境変数で設定できるから書き込み権限があるディレクトリを設定しなよ



原因の特定のために、/var/opt/kanon/trac/ を誰でも書き込めるようにして再度、http://localhost/trac/[projectname] にアクセスすると・・・動きました。

で、次にリポジトリということで、http://localhost/hg/[projectname]
にアクセスすると・・・

You don't have permission to access /hg/[projectname] on this server.

ってなメッセージが、作成したディレクトリの所有者をみると、rootになってるのでこれを_wwwに変更してサイドアクセスしてみるけど、やっぱり駄目。
ディレクトリの中身には『.hg』ってディレクトリができているので、おそらく hg init コマンドは正常に動作したっぽい。
となると、httpd.confだろう、ということでMercurialの設定箇所を再度確認してみる。

# Mercurialの設定
WSGIScriptAlias /hg /opt/kanon/lib/cgi-bin/hgweb.wsgi

WSGIApplicationGroup %{GLOBAL}
AuthType Digest
AuthName kanon
AuthUserFile /etc/opt/kanon/kanon_users.htdigest
Require valid-user

とりあえず、『AuthType Digest』の前に『Allow from all』を追加してみる。
・・・おぉ、ユーザー名とパスワードの入力画面がでてきた。
で、ログインしてみるとそれっぽい画面が(笑)。
セキュリティ的に大丈夫か?という問題はあるにしろ、動くことは動きました。

ちなみに、ディレクトリのパーミッションに問題はあったものの、subversionはアクセスしたらユーザー名とパスワードの確認画面がでてきたので、こちらは問題ない模様(subversionは、apacheのモジュールで動いているみたいで、Mercurialとは仕組みが違う)。

Bazaarは確かめていませんが、Mercurialと同じ仕組みみたいなので、同じようにすれば、たぶん動くと思います。


さて・・・あとは、使ってみるか、対応済みのOSの仮想環境作って、正しい設定を確かめながら、いろいろいじってみるか、って感じだけど、とりあえず使ってみるかな。

もともとは、自分の作業のタスク管理をしようかと思って、tracいれるか、って思っていたところに脱線しちゃったわけだから、できるだけタスク管理は始めたいし、実際に動かしてみたら、まだ、なにかあるかもしれないしね(笑)。

kanonをmacへインストールしようとしてみた2(動

なんか、いろいろあって、もうちょっと頑張ってみることにした。
macで開発環境作ったことなかったし、portになれておくのもいいのかも?

というわけで、昨日のブログの続き。
macports用のリストを作って、kanon-setupに組み込むところからです。

pkglist.macの作成

  • pkglist.macを作成して、すでにインストール済のmod_wsgiに加え、他のosリストを参考にしながら必要そうなパッケージを追加
    • unicode_pathオプションはもしかしたらない方がいいかも?

mod_wsgi
mercurial
subversion +mod_dav_svn +unicode_path
bzr
sqlite3

  • OSがmacのときは、pkglist.macを使ってportsのコマンドを実行するようにkanon-setupを修正
    • 修正した箇所はこんな感じ
### install ubuntu package
if [ "$OS" = 'ubuntu' ]
then
    apt-get update
    apt-get -y install `cat pkglist.ubuntu`
elif [ "$OS" = 'rhel' ]
then
    yum -y install `cat pkglist.rhel`
elif [ "$OS" = 'mac' ]
then
    port selfupdate
    port install `cat pkglist.mac`
fi

/opt/kanon/bin/kanon-create-project でエラーが起きるので対応(直接編集しちゃったけど、mac版作った方がいいかも)

  • macapacheは、グループが"_www"、ユーザーは"admin"で動くっぽいのでchownコマンドをそのように修正
    • グループ名とユーザー名は、若干あやしいのでもうちょっとしっかり調べた方がいいかも
    • あと、修正が難しかったので、今回、この部分はmacでしか動かないように直しちゃいました
which apache2 >& /dev/null
if [ $? = 0 ]
then
    APACHE_USER=www-data
else
    which httpd >& /dev/null
    if [ $? = 0 ]
    then
        APACHE_USER=apache
    else
        echo "Apacheが見つかりません。Apacheをインストールしてください。"
        exit    fi
fi

//mac用に設定
APACHE_USER=admin
APACHE_GROUP=_www
  • chownがエラーになるので、該当箇所を修正
    • リポリトリのchown
# リポジトリ作成

if [ "$REPO_TYPE" = 'hg' ]
then
   hg init $KANON_VAR/hg/$PROJECT_NAME
   chown -R $APACHE_GROUP:$APACHE_USER $KANON_VAR/hg/$PROJECT_NAME
elif [ "$REPO_TYPE" = 'svn' ]
then
   svnadmin create $KANON_VAR/svn/$PROJECT_NAME
   cp $KANON_CONFIG/vcs-template/svn/* $KANON_VAR/svn/$PROJECT_NAME/hooks
   chown -R $APACHE_GROUP:$APACHE_USER $KANON_VAR/svn/$PROJECT_NAME
elif [ "$REPO_TYPE" = 'bzr' ]
then
   bzr init-repo $KANON_VAR/bzr/$PROJECT_NAME
   bzr init $KANON_VAR/bzr/$PROJECT_NAME/trunk
   chown -R $APACHE_GROUP:$APACHE_USER $KANON_VAR/bzr/$PROJECT_NAME
elif [ "$REPO_TYPE" != '' ]
then
   echo "Unsupported repository type: " $REPO_TYPE
   exit
fi
    • トラックのプロジェクトのパスのchown
chown -R $APACHE_GROUP:$APACHE_USER $TRAC_PROJECT_PATH

mac用のhttpd.confを作成

  • apacheの起動で以下のエラーが発生します

Unknown DAV provider: svn

  • なんで、httpd.conf.rhelをもとにhttpd.conf.macを作成し、ファイルの先頭にmod_dav_svn.soのロードを追加

LoadModule dav_svn_module modules/mod_dav_svn.so

  • で、再度実行すると、今度は以下のようなエラーメッセージが表示されます

Invalid command 'AuthzSVNAccessFile', perhaps misspelled or defined by a module not included in the server configuration

  • mod_authz_svnが必要だっていわれているみたいですね。なんで、もう1行追加します

LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so

  • で、apacheを再起動して、http://localhost/trac/[projectname] にアクセスしたときに、以下のような画面が表示されます

Traceback (most recent call last):
File "build/bdist.macosx-10.6-universal/egg/trac/web/api.py", line 436, in send_error
data, 'text/html')
File "build/bdist.macosx-10.6-universal/egg/trac/web/chrome.py", line 832, in render_template
template = self.load_template(filename, method=method)
File "build/bdist.macosx-10.6-universal/egg/trac/web/chrome.py", line 793, in load_template
self.get_all_templates_dirs(), auto_reload=self.auto_reload,
File "build/bdist.macosx-10.6-universal/egg/trac/web/chrome.py", line 506, in get_all_templates_dirs
dirs.extend(provider.get_templates_dirs() or [])
File "build/bdist.macosx-10.6-universal/egg/trac/web/chrome.py", line 484, in get_templates_dirs
pkg_resources.resource_filename('trac', 'templates'),
File "/opt/kanon/lib/python2.6/setuptools-0.6c9-py2.6.egg/pkg_resources.py", line 841, in resource_filename
self, resource_name
File "/opt/kanon/lib/python2.6/setuptools-0.6c9-py2.6.egg/pkg_resources.py", line 1311, in get_resource_filename
return self._extract_resource(manager, zip_path)
File "/opt/kanon/lib/python2.6/setuptools-0.6c9-py2.6.egg/pkg_resources.py", line 1318, in _extract_resource
manager, os.path.join(zip_path, name)
File "/opt/kanon/lib/python2.6/setuptools-0.6c9-py2.6.egg/pkg_resources.py", line 1332, in _extract_resource
self.egg_name, self._parts(zip_path)
File "/opt/kanon/lib/python2.6/setuptools-0.6c9-py2.6.egg/pkg_resources.py", line 921, in get_cache_path
self.extraction_error()
File "/opt/kanon/lib/python2.6/setuptools-0.6c9-py2.6.egg/pkg_resources.py", line 887, in extraction_error
raise err
ExtractionError: Can't extract file(s) to egg cache

The following error occurred while trying to extract file(s) to the Python egg
cache:

[Errno 13] Permission denied: '/var/opt/kanon/trac/.egg-cache'

The Python egg cache directory is currently set to:

/var/opt/kanon/trac/.egg-cache

Perhaps your account does not have write access to this directory? You can
change the cache directory by setting the PYTHON_EGG_CACHE environment
variable to point to an accessible directory.

もっとスムーズに行くかと思ってたけど、意外と道のり長いな。。。
とりあえず、エラーで気になるのは、以下の箇所

Permission denied: '/var/opt/kanon/trac/.egg-cache'

次やるとしたら、apacheのユーザーまわりと、pythonまわりみてみる感じか。
続く?