tanikoのぶろぐ

Saoriの使い方

PHPを使ってgithub.ioでブログをやるための静的サイトジェネレータであるsaoriの使い方を簡単にですがまとめました. リンクはこちらです.
現在, 使い方だけなのでテーマの作成方法など内部的な話は書けていませんが近いうちに書きたいと思います.

学年暦のスクレイピングについて

前の記事でPHPを使って,学年暦のスクレイピングを行うライブラリの紹介をしたので,今回はそれを作ったことの話をします. スクレイピングはfabpot/goutteを使用しました

ページをローカルで動かす

おそらくコード書いて1回では成功できず,何度も失敗すると思うので,負荷を与えないように対象のページをダウンロードしてローカルで動かしてそこにスクレイピングをしましょう.
Chromeで 'Command(Control) + S'でダウンロードできます. ファイル名はindexでいいです. 次に動かし方ですが, PHPのビルトインサーバを使いましょう.

cd public
php -S localhost:8000

詳しくはここで.

スクレイピングをする

タイトル

ブラウザで上記のlocalhostにアクセスをして学年暦のタイトル(ページのタイトルではない)を探します.

  1. 2016年度 立命館大学 学年暦

  2. 2016年度 立命館大学大学院 学年暦 セメスター制 (法学研究科、経済学研究科、経営学研究科、社会学研究科、文学研究科、国際関係研究科、政策科学研究科、応用人間科学研究科、言語教育情報研究科、公務研究科、スポーツ健康科学研究科、映像研究科、先端総合学術研究科)

  3. 2016年度 立命館大学大学院 学年暦 セメスター制 (理工学研究科、情報理工学研究科、生命科学研究科、薬学研究科)

  4. 2016年度 立命館大学大学院 学年暦 セッション制 (テクノロジー・マネジメント研究科、経営管理研究科)

  5. 2016年度 立命館大学大学院 学年暦 (法務研究科)

この5つがあるので,これをタイトルとして,5つの学年暦を取得します. Chromeで右クリック→検証で構造を確かめられるので,見に行くとclass="mod-title type4"が割り振られているので

$title = $crawler->filter('.mod-title.type4')->eq($i)->text();

で得られます.

年度

年度ですが,これはタイトル内に書かれているのでpreg_match()を使って「2016」を拾ってあげます.

各学年暦

ここからがスクレイピングするのには面倒な構造になっています.というのも, 学部と大学院では構造が異なっているのです. 学部の方は, mod-wysiwyg > set-table > table内にtheadとtbodyが2つ(前期・後期)あります. 一方, 大学院の方はmod-wysiwyg > set-table が2つ(前期・後期)です.
eventはclass="event"ではなくテーブルの要素(イベント名・月・日)だと考えてください. mod-wysiwyは略.

これは不親切ですね. しかし,うまいこと下から順に配列を結合させていくと,5つの学年暦ができます. 考え方としては, 各学年暦にはset-tableが複数あり,tableの中にもtbodyが複数あることを前提に作るってことです. 結合やイベントのことなどはコードを見てもらうほうがいいかと.

同じ日の行事はまとめられているので注意してください.

立命館の学年暦をスクレイピング

ritsucal

ritsucalは立命館大学・大学院の学年暦をスクレイピングするPHPのライブラリです. 前から作っていてGitHubにあげていましたが,久しぶりに見るとREADME.mdに変な文字が混ざっていたので,いくつか修正して,そのついでに簡単な使い方を書きます.

インストール

インストールはcomposerからできます

composer require hrgruri/ritsucal

使い方

<?php
require 'vendor/autoload.php';
try {
    $client = new Hrgruri\Ritsucal\Client();
    $calenders = $client->getCalenders();
    var_dump($calenders);
} catch (\Hrgruri\Ritsucal\Exception\UrlException $e) {
    print "Error\n";
}

こんな感じでコードを書くと動きます. 得られるのは以下の学年暦.

  1. 2016年度 立命館大学 学年暦

  2. 2016年度 立命館大学大学院 学年暦 セメスター制 (法学研究科、経済学研究科、経営学研究科、社会学研究科、文学研究科、国際関係研究科、政策科学研究科、応用人間科学研究科、言語教育情報研究科、公務研究科、スポーツ健康科学研究科、映像研究科、先端総合学術研究科)

  3. 2016年度 立命館大学大学院 学年暦 セメスター制 (理工学研究科、情報理工学研究科、生命科学研究科、薬学研究科)

  4. 2016年度 立命館大学大学院 学年暦 セッション制 (テクノロジー・マネジメント研究科、経営管理研究科)

  5. 2016年度 立命館大学大学院 学年暦 (法務研究科)

var_dump()した結果の一部です

array(5) {
  [0]=>
  object(Hrgruri\Ritsucal\Calender)#66 (2) {
    ["title"]=>
    string(40) "2016年度 立命館大学 学年暦"
    ["events"]=>
    array(79) {
      [0]=>
      object(Hrgruri\Ritsucal\Event)#111 (4) {
        ["year"]=>
        int(2016)
        ["month"]=>
        int(4)
        ["day"]=>
        int(1)
        ["title"]=>
        string(27) "前期セメスター開始"
      }
      [1]=>
      object(Hrgruri\Ritsucal\Event)#65 (4) {
        ["year"]=>
        int(2016)
        ["month"]=>
        int(4)
        ["day"]=>
        int(1)
        ["title"]=>
        string(27) "オリエンテーション"
      }

デフォルトでは http://www.ritsumei.ac.jp/profile/info/calender/ から情報を取ってきますが,

$calenders = $client->getCalenders('http://www.ritsumei.ac.jp/profile/info/calender/2016/');

などのようにすると別の年度の学年暦を取ってくることができます.


追記 2016-06-25

JSON

他の言語でもデータを扱うためにJSON形式で保存する方法です.

<?php
require 'vendor/autoload.php';
try {
    $client = new Hrgruri\Ritsucal\Client();
    $calenders = $client->getCalenders();
    file_put_contents(
        'file_path',
        json_encode($calenders, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)
    );
} catch (\Hrgruri\Ritsucal\Exception\UrlException $e) {
    print "Error\n";
}

file_put_contents()で指定したところに保存できます. json_encode()のJSON_PRETTY_PRINT, JSON_UNESCAPED_UNICODEは見やすい形にしてくれるオプションです.

Saori v0.5を作った

Saori v0.5.0をリリースした. これで簡単にユーザが新たなページを生成することができるようになった. そして,前の記事で言っていたテーブルがおかしい理由はテーブルのCSSが記述されていなかったからでした. ボーダの設定を指定なかったので,枠線がない状態で出力されていただけでした.


そろそろv0.x系をやめてv1.0にしてもいい頃かもしれない. 最初に思っていた必要な最低限の機能はできたと思う.
それとちゃんとした使い方をまとめて記事かページを生成する必要がある. 今のところ他の人が使うのには不親切だ. README.mdには記事の編集のことしか記述していない. (誰か作る人がいるのかわからないが)テーマの作り方やユーザページについてなど. こういったものをまとめ終えたらv1.0.0にしたいと思います.