tanikoのぶろぐ

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

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は見やすい形にしてくれるオプションです.

立命館ARCのスクレイピング

PHPでスクレイピング

創成3では立命館大学アート・リサーチセンター(以下ARC)のアクセスログを使って資料の推薦を行うことが目的でした. 最初はリンクだけを使った質素なものを作る予定でしたが, 途中でスクレイピングをして, サイト内だけで簡単な検索・閲覧をできるようにすることになりました. PHPを使ってやったのですが,これがとっても大変でした.

謎のname

HTMLのFormのほとんどにはname属性がつけられています.

<input type="text" name="username">

nameからどういった値が入るのか推測できるようになっているべきです.上の例だとユーザ名が入るのだと推測できます. しかしながらARCのフォームでは全くそれがなされていなかった.

浮世絵データベース

name
f85キーワード
f23絵師
f83画題

古典籍データベース

name
f61資料名
f63編著者

まったく謎です. ちなみに浮世絵DBの絵師であるf23ですが,古典籍DBでは資料のソート(成立月日順)のために使われています. ちなみに統一されているものも一応あります.

name
-max表示件数
skipスキップ数
この2つは推測できますね. なぜかmaxではなく-maxですが. 統一されておらず,推測できないのはスクレイピングする側としては辛いですね. サーバサイドのコードを書くに扱いづらくなかったのでしょうか?

作ったライブラリ

オープンキャンパスのために創成3のサイトを再び作っているので使っているが, それさえ終わればもう使うことはないと思う. GitHubにアップロードしています. またComposerからインストールして使うことができます.

composer require hrgruri/rarcs
<?php
require 'vendor/autoload.php';

$client = new Hrgruri\Rarcs\NishikieClient();
var_dump($client->getDetail('arcUP2435'));
/*
object(Hrgruri\Rarcs\Asset\Nishikie)#51 (5) {
  ["artist"]=>
  string(6) "広貞"
  ["id"]=>
  string(9) "arcUP2435"
  ["url"]=>
  string(62) "http://www.dh-jac.net/db/nishikie/results-big.php?f1=arcUP2435"
  ["title"]=>
  string(54) "「菅原 三ノ口」「松王丸」「梅王丸」"
  ["cover"]=>
  string(87) "http://www.arc.ritsumei.ac.jp/archive01/theater/image/PB/arc/Prints/arcUP/arcUP2435.jpg"
}
 */

Saori v0.4.0を作りました

v0.4.0での変更点は

  • Twigファイルの場所の変更
  • config.jsonの場所を変更
  • ユーザページの生成機能

Twigファイルの場所の変更について

Twigファイルの場所をtheme/:theme_name/twig/にしました. サイトを生成するのに必要なテンプレートはtemplate内に置きました.これからはsaoriが直接呼び出すTwigファイルはここにおいていこうと思います.

config.jsonの場所を変更について

contentsディレクトリ内にconfig.jsonを設置するように変更しました. 何故したかというと,config.jsonもgitで管理しやすくするためです.

ユーザページの生成機能について

それと前に言ってた,ユーザがMarkdownファイルを作るだけでページを生成できるようにしました. 例えば,contents/page/about.mdというファイルを作るとtemplate/page.twigを利用して,/about/index.htmlが作られます. しかしこれだと画像が扱えない(作ってから気づいた)ので,v0.5では画像をどこかにコピーしてMarkdownファイル内にある画像のパスをそこに書き換えようかな思います.

icd3

先生「創成3で作ってもらったサイトをオープンキャンパスで見せようと思う」
私「あっ,はい. ちゃんとしたコードに直したかったので, 修正したら渡します」
先生「それなんだけどね, 今のままだと書籍だけで見た感じが微妙だから絵も推薦できるようにして. 7月末までにしておいてね」

こんなわけで,前に作ったサイトの見た目をとかを修正するだけだったつもりが, 先生からのお願い(?)で推薦対象となるカテゴリーを増やすことになりました.
追加することになったのは浮世絵. 浮世絵のログは抽出してDBに保存していなかったので,もう一度アクセスログの解析をすることになりました. クローラなどのログはすでに落としてあるのがあったと思うので,そこからもう一度.

I Love PHP なのでもちろんPHPを使います. スクレイピングもPHPです. スクレイピングのコードも前まではクラスを作ってそれを使っていただけだったのですが, 今回はComposerでインストールして使えるようにして公開したいと思います.

実行環境は,今日,研究室に立てたUbuntu Serverを使おうかなと. 開発段階では研究室のみからアクセスできるようにしておけばいい. オープンキャンパスの時のみ,大学のIPだけを通すようにするとか考えたが... 前回と同様にデータを先生に渡すだけになるのかな

Saori v0.3を作った

Saoriにいくつか機能を加えた.

v0.2

v0.2ではフィード(/feed.atom)を生成するようにしたり,簡単なタグ機能を加えた.

v0.3

v0.3では機能の追加ではなく,コードを分けたり修正したりした.あと生成する際に使用するtwigファイルの場所を変更したので,v0.2からv0.3でテーマの互換性がないですが,sampleテーマは直した.

v0.4でしたいこと

v0.4ではconfig.jsonの場所をcontentsの中にしたい. あとinitでconfig.jsonファイルの生成も. 機能としてはテーマが設定したページを作れるようにしたり,ユーザがMarkdownファイルを作るだけで設定されたテンプレートからページを生成できるようにしたい.


現在アクセスできるのは

  • /page/:page_number
  • /article/:year/:month/:title
  • /tag
  • /tag/:tag_name/:page_number