サーバ構築演習の科目があります。最終課題は、なんらかの連携(Web)をするシステムを構築してみやう!というものです。
その課題のテーマ例として「図書館へ推薦する図書の一覧を作るのが面倒なので誰か作ってくれないかな〜」というのを書いておきました。
結局、そのコマンドライン版を自分で作りました。でも、グラフィカルなものは興味がないので誰かよろしく
仕様
- 目標 ... コマンドライン(CUI)版はGUI版とは目標が異なります
- GUIは1個2個を処理する素人さんむけのもの (未実装)
- このCUIは、数十個の推薦を一気に処理したいというもの (実装したもの)。バッチ処理といってもいいです
- 使い方(想定している運用方法)
- あらかじめブラウザで推薦候補(数十個)をブックマークしておきます
- ブラウザのブックマークを全部選択してコピーすればURL一覧がクリップボードに入ります
- テキストファイルにクリップボードの中身を貼りつけます
- 推薦図書一覧が1行1URLになったテキストファイルの完成です
- このテキストファイルをプログラムで処理すると必須情報のまとめが表示されます
- プログラミング言語 ... テキスト処理なんだから、得意のPerlでいってみやう!
- 注意点/工夫点
- 取得したデータ(HTML)はキャッシュするようにしました。つまりURLを見にいくのは最初の一回だけです
- コマンドラインオプションで、出力モードを切り替えられます。テキストとCSVモードあり。デフォルトはテキスト
- 取得するデータフォーマットはサイトごとに異なります。
ここはサイトの数だけ造り込みが必要です。
とりあえずAmazon(とラムダノート)だけ対応しています - すでに大学図書館に登録済みか?も確認します(ISBNで問い合わせ)
出力例
title = 日本インターネット書紀 この国のインターネットは、解体寸前のビルに間借りした小さな会社からはじまった
isbn13 = 9784062189446
price = 4730
exist? = yes
コード見本
いまのところ約300行です。先頭のモジュールとメインループだけ書いておきます。
#!/usr/bin/env perl
use strict;
use warnings;
use Carp;
use utf8;
use FileHandle;
use File::Spec;
use File::Path;
use LWP::UserAgent;
use Encode qw(decode encode is_utf8);
use JSON qw/encode_json decode_json/;
our $cache_dir = "$ENV{HOME}/work/bookdb";
while (my $buf = <>) {
chomp $buf;
next if $buf =~ /^\#/; # ignore comments
next unless $buf =~ /https/i; # ignore not HTTP/HTTPS lines
my ($id, $flag, $data) = url_parse($buf);
# 省略 ... $data を出力 ...
}
exit 0;