書籍情報の取得方法〜蔵書リストの作り方〜

AKIYAMA Kouhei

2002年06月02日 初稿

目次

  1. 動機と目的
  2. 仕組み〜bookinfoパッケージの作成
  3. 蔵書リストを作る
  4. 課題
  5. 最後に
  6. 参考文献

1 動機と目的

蔵書リストを作りたい。しかしタイトルや著者などを入力するのが面倒くさい。

そこでISBN(国際標準図書番号)を元にインターネットから書籍情報を自動的に取得するperlスクリプトを作成した。

2 仕組み〜bookinfoパッケージの作成

今回はwww上にある書籍情報提供サイトを利用して本の情報を取得することにした。www上には書籍の通販サイトが数多く存在する。その多くはISBNから書籍情報を検索できるようになっているのでこれらを利用させてもらうことにした。

具体的な処理手順としては以下のようになる。

  1. ISBNから書籍情報を検索するhttpリクエストを発行し
  2. 結果のhtmlを取得
  3. 必要な項目を抜き出す

この処理を今回はperlで記述することにした。これは現在メインで使っているサーバに導入されている言語の種類が少なく、使える言語の中でperlが一番ポピュラーだったからだ。

perlでwwwページを取得する方法は検索すればすぐに見つかった。[参考文献1]

それを元に作ったperlのサブルーチンが以下のget_book_info_onlineである。実行にはjcode.plが必要だ。

#!/usr/bin/perl
require "jcode.pl";

;# インターネット上から書籍情報を取得します。
sub get_book_info_online {
    local($isbn, *title, *author, *publisher) = @_;

    ;# ISBNからハイフンを取り除きます。
    $isbn =~ s/-//g;

    ;# 書籍情報を提供するサイトから書籍情報を含むhtmlを取得し、$dataに格納します。
    local($host) = "www.netdirect.co.jp";
    local($page) = "/search/ISSSchDetail.asp?ISBN=" . $isbn;
    local($data) = "";
    local($addr) = (gethostbyname($host))[4];
    local($name) = pack("S n a4 x8", 2, 80, $addr);
    socket(S, 2, 1, 0);
    connect(S, $name);
    binmode(S);
    local($old) = select(S);
    $| = 1;
    select($old);
    print S "GET $page HTTP/1.0\r\n\r\n";
    while (<S>) { $data .= $_; }
    close(S);
    jcode::convert(\$data, 'euc');

    ;# 書籍データの各項目を取り出します。
    ;# サイトの出力形式が変わると書き直す必要があります。
    ;# 以下は2002-05-29におけるwww.netdirect.co.jp/search/の出力に対するものです。
    if($data =~ '.*<font size="3" COLOR="#FFFFFF">([^<&]*)</font>.*'){
        $title = $1;
    }
    if($data =~ '.*著者:[^\n]*\n[^\n]*\n[^\n]*\n *([^<&]*)</font>'){
        $author = $1;
    }
    if($data =~ '.*出版社:[^\n]*\n[^\n]*\n[^\n]*\n *([^<&]*)</font>'){
        $publisher = $1;
    }
}


;# 以下はテスト用のコード
@isbn_list = ("4-7561-1895-X", "4-89471-410-8");

foreach $isbn (@isbn_list){
    get_book_info_online($isbn, \$title, \$author, \$publisher);
    print "$isbn:$title:$author:$publisher\n";
}

やってみると一件の取得にずいぶんかかることが分かる。そこで一回情報を取得したらキャッシュファイルに格納し、次回からはそこを参照するように改良した。これをbookinfoパッケージとしてまとめたのが以下のファイルである。

このパッケージはget_book_infoサブルーチンを提供する。サブルーチンには情報を取得したい本のISBNと得られた情報を格納させたい変数への参照をパラメータとして引き渡すこと。インターネットから得られた情報は./data/book_info_cacheというファイルにキャッシュされる。

3 蔵書リストを作る

それでは早速bookinfoパッケージを利用して蔵書リストを作成しよう。まずやることは所有している本のISBNを片っ端から入力することだ。例えば以下。

./data/library_listファイル(EUC-JPでunix改行コードで作ること)

4-7561-1895-X
4-89471-435-3
4-89471-410-8
4-7561-1853-4
...以下略

このlibrary_listファイルからbookinfoパッケージを使用して書籍一覧を作成するコードが以下である。

#!/usr/bin/perl
require "bookinfo.pl";

print "Content-type:text/html\n\n";

print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"\n";
print "   \"http://www.w3.org/TR/html4/strict.dtd\">\n";
print "<html lang=\"ja\">\n";
print "<head>\n";
print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=EUC-JP\">\n";
print "<link rel=\"stylesheet\" type=\"text/css\" href=\"../style.css\">\n";
print "<title>蔵書リストCGI</title>\n";
print "</head>\n";
print "<body>\n";
print "<h1>蔵書リストCGI</h1>\n";


#蔵書リストを読み込み
open(IN, "data/library_list") || die "cannot open library_list .. $!\n";

print "<table border=\"1\">\n";
print "<tr><th>ISBN</th><th>タイトル</th><th>著者</th><th>出版社</th></tr>\n";

while($isbn = <IN>){
    chop($isbn);
    bookinfo::get_book_info($isbn, \$title, \$author, \$publisher);

    $isbn_number = $isbn;
    $isbn_number =~ s/-//g;

    print "<tr>";
    print "<td><a href=\"http://www.netdirect.co.jp/search/ISSSchDetail.asp?ISBN=$isbn_number\">$isbn</a></td>";
    print "<td>$title</td>";
    print "<td>$author</td>";
    print "<td>$publisher</td>";
    print "</tr>\n";
}
print "</table>\n";
close(IN);

print "</body> </html>\n";

あとは実行してしばらく待つだけだ。これで書籍情報を手で入力するよりはるかに簡単に蔵書リストが作成できる。

4 課題

以下のような課題が挙げられる。

5 最後に

ここで紹介した手法は書籍だけでなく、他のwww上にある情報に対しても応用できるはずだ。簡単なスクリプト言語によるwwwページの自動処理によって、溢れる情報を効率よく整理・利用することができる。面白い応用を思いついた人は是非教えて欲しい。

6 参考文献

  1. 杜甫々.とほほのperl入門.1997-2002.

上へ

Last modified: Sun Jun 02 21:29:38 2002