アマゾンAPIを活用した蔵書管理システム(1)

November 15, 2008 – 1:26 pm

もう1月半も前に「アマゾンの書籍データベースにPHPでアクセスしてみた」という記事を書いた。これは、以前に試作した「蔵書管理システム」用の書籍データでアマゾンのデータが活用したいというのが動機だった。さて、その後、蔵書管理用のデータベースの構造とか、アマゾンの書籍データベースからどの程度のデータが取得できるのか、我が蔵書管理システムをアップグレードにむけ、いろいろ検討してみた。一応のメドがたったので、何回かにわけて、経験を記しておくことにした。このエントリーは、その第一回。

蔵書管理システムのアップグレード: 以前、試作した「蔵書管理システム」は、システムを構築するというより、むしろMySQL、phpそしてHTMLのフォームの基本を学ぶことを目的に作成したものだ。試作したデータベースは単一のテーブルを用いた単純なもの、データベースといっても、基本的には、EXCELの表計算ツールで間に合うしろものだった。

ここから一歩進んで、複数のテーブルからなる、より拡張性の高いシステムを作成することにした。一言でいうなら、本格的なリレーショナルデータベースに挑戦しようというわけだ。拡張性の高いシステムを作るということになれば、当然、我が蔵書管理システムの機能についても再考しなければならい。

再構築しようとする「蔵書管理システム」の仕様を明確にするため、まず、アマゾンからのデータ取得の可能性とその手続きについて考えてみた。

アマゾンの書籍データを取得するには? いろいろなサイトでアマゾンからデータを取得し、蔵書管理システムを作っていることが紹介されている。これら大部分が、ISBN(もしくはISBN-13)から手元の書籍データを取得するという話のようだ。

しかし、私の本棚にある書籍の大部分は30年以上前に購入したもの。こうした書籍には、残念ながら、ISBNコードが割り振られていない。これらはアマゾンサイトでは「古書」として扱われている。私の所有している書籍について調べてみると、一部を除いて、大部分は「古書」として扱われている。こうした書籍にはアマゾンの商品コードASINが割り振られている。因みに、ISBNコードが割り振られている書籍のASINにはISBNコードが割り振られている。

この「古書」の書籍データを効率よく取り込むことができなければ、我が「蔵書管理システム」としては不適だ。私にとっては意味がないものになってしまう。

検索方式をどのようにする? :ということで、アマゾンから書籍データを取得するには、ISBNで検索できる書籍についてはISBNで、そしてISBNが割り振られていない書籍については、まず書籍のタイトル、著者名で候補となる書籍を検索し、検索された複数の書籍からターゲットとする書籍を選択することによりASINコードを求め、これにより書籍データを取得するという手順をとることになるだろう。

こうした手順を踏むには、アマゾンの書籍データベースから、著者名、タイトルにより我が「蔵書管理システム」に登録する候補書籍を抽出する仕組みが必要になる。簡単なphpコードを書いてみることにした。

タイトルと著者名から候補書籍の抽出: アマゾンAPIを活用し、書籍のタイトル、著者名を用いて検索し、候補書籍を抽出するphp関数BookSearch()を作成してみた。この関数のソースは、この記事の終わりに掲げることにし、検索・抽出例を具体的に示してみることにしよう。

我が本棚に眠っている「古書」のひとつ、遠藤周作著 「沈黙」(1964,新潮社刊)を例に、このBookSearch()を使って書籍を検索してみよう。まず、BookSearch()を使ったスクリプトSample.phpを作り、抽出される書籍のASINコード、著者名、タイトル、出版社名を出力してみることにする。

Sample.php:
<?php
require_once("BookSearch.php");
$title  = '沈黙'; $author = '遠藤周作'; $page   = '1';
$books = BookSearch($title,$author,$page);
echo "No of Items : " . $books[0]->getNoOfItems() . "\n"; echo "size of tmp_array : " . sizeof($books) . "\n"; for( $i= 0; $i<sizeof($books); $i++ )        echo $books[$i]->getAsin() . ": "           . $books[$i]->getAuthor() . ":  "           . $books[$i]->getTitle() . ":  "           . $books[$i]->getPublisher() . "\n";
$books=NULL; ?>

これをコンソール上で実行すると;

% php Sample.php
No of Items : 12
size of books : 10
4101123152: 遠藤 周作:  沈黙 (新潮文庫):  新潮社
410303517X: 遠藤 周作:  沈黙:  新潮社
B000JABMF8: 遠藤 周作:  沈黙 (1966年):  新潮社
4833480018: 遠藤 周作:  沈黙の声 (カミユ文庫):  プレジデント社
439344406X: 遠藤 周作:  遠藤周作とShusaku Endo―アメリカ「沈黙と声」遠藤文学研究学会報告:  春秋社
4770010141: 遠藤 周作:  沈黙―Silence (Japan’s modern writers):  講談社インターナショナル
4860551796: 遠藤 周作:  沈黙〈2〉 (大活字文庫):  大活字
B000J8GXTK: 遠藤 周作:  沈黙 (1979年):  新潮社
4860551788: 遠藤 周作:  沈黙〈1〉 (大活字文庫):  大活字
486055180X: 遠藤 周作:  沈黙〈3〉 (大活字文庫):  大活字

となる。著者名「遠藤周作」、タイトル「沈黙」を含む書籍のうちアマゾンの書籍データベースには12件があり、一回の操作で10件の関連書籍が出力されている。この出力結果から我が家にある該当書籍のASINコードはB000JABMF8であることが特定される。

アマゾンデータベースにAPIでアクセスして取得できる書籍(商品)件数は一回で10件毎に出力することになる。10件目以降のデータを取得しようとする場合、パラメータItemPage(BookSearch()の3番目の引数に該当)を変えれば良い。11件目以降のデータについて、Sample.phpの$pageを2として実行すると以下のように残りの2件のデータを取得することができる;

% php Sample.php
No of Items : 12
size of books : 2
4888510830: 遠藤 周作:  遠藤周作『沈黙』草稿翻刻:  長崎文献社
4108026020: 遠藤 周作:  沈黙について,日本が初めて西洋と出会った頃 (新潮カセット講演):  新潮社
        

==================

BookSearch.php:

<?php
function BookSearch($Title_Search, $Author_Search, $Page_AWS)
{
        require_once("./TmpBook.php");
        define('KEYID','*********************'); 
            $request='http://ecs.amazonaws.jp/onca/xml?Service=AWSECommerceService'         . '&AWSAccessKeyId='.KEYID.'&Operation=ItemSearch'         . '&ResponseGroup=Medium&Version=2008-08-19&SearchIndex=Books'         . '&Title=' . $Title_Search . '&Author=' . $Author_Search         . '&ItemPage=' . $Page_AWS;             $response   = file_get_contents($request);             $parsed_xml = simplexml_load_string($response);         // Get AWS 判定             $IsValid    = $parsed_xml->Items->Request->IsValid;             if( $IsValid != 'True' ) return -1;         //             $No_of_Results = $parsed_xml->Items->TotalResults;             $n_foreach = 0;             $tmpbook_array = array();             foreach( $parsed_xml->Items->Item as $Item ) {                 // Get ASIN                 $Asin       = $Item->ASIN;                 // Get Book_Data                 $Attributes = $Item->ItemAttributes;                 $Binding      = $Attributes->Binding;                 $Isbn         = $Attributes->ISBN;                 $EAN          = $Attributes->EAN;                 $Pub_Date     = $Attributes->PublicationDate;                 $Publisher    = $Attributes->Publisher;                 $Title        = $Attributes->Title;                 $author_name = array();                 $ncr = 0;                 foreach( $Attributes->Author as $Author_name ) {                         $author_name[$ncr] = $Author_name;                         //   echo "author = " . $author . "\n";                         $ncr = $ncr + 1;                 }                 foreach( $Attributes->Creator as $Creator ) {                         $author_name[$ncr] = $Creator;                         $ncr = $ncr + 1;                 }                 $Author_name = $author_name[0];                 $tmpbook = new TmpBook();                 $tmpbook->setNoOfItems($No_of_Results);                 $tmpbook->setAsin($Asin);                 $tmpbook->setIsbn($Isbn);                 $tmpbook->setEan($EAN);                 $tmpbook->setPubdate($Pub_Date);                 $tmpbook->setPublisher($Publisher);                 $tmpbook->setTitle($Title);                 $tmpbook->setAuthor($Author_name);                 $tmpbook->setBinding($Binding);                 $tmpbook_array[] = $tmpbook;                 $n_foreach = $n_foreach + 1;                 if ( $n_foreach >=10 || $n_foreach == $No_of_Results ) break;            }            return $tmpbook_array; } ?>

TmpBook.php:

<?php
class TmpBook {
        private $no_of_items  = "";
        private $asin         = "";
        private $isbn         = "";
        private $ean          = "";
        private $title        = "";
        private $pubdate      = "";
        private $page         = "";
        private $publisher    = "";
        private $binding      = "";
        private $author       = "";

        public function toString() {
           return (string) ($this->no_of_items . "\t" . $this->asin ."\t" . $this->isbn . "\t" .
                  $this->ean . "\t" . $this->title . "\t" . $this->author . "\t" .
                  $this->pubdate . "\t" .
                  $this->publisher . "\t" . $this->binding . "\t" );
        }

        public function getNoOfItems() {
            return $this->no_of_items;
        }

        public function setNoOfItems($no_of_items) {
            $this->no_of_items = $no_of_items;
        }

        public function getAsin() {
            return $this->asin;
        }

        public function setAsin($asin) {
            $this->asin = $asin;
        }

        public function getIsbn() {
            return $this->isbn;
        }

        public function setIsbn($isbn) {
            $this->isbn = $isbn;
        }

        public function getEan() {
            return $this->ean;
        }

        public function setEan($ean) {
            $this->ean = $ean;
        }

        public function getTitle() {
            return $this->title;
        }

        public function setTitle($title) {
            $this->title = $title;
        }

        public function getAuthor() {
            return $this->author;
        }

        public function setAuthor($author) {
            $this->author = $author;
        }

        public function getPubdate() {
            return $this->pubdate;
        }

    public function setPubdate($pubdate) {
            $this->pubdate = $pubdate;
        }

        public function getPages() {
            return $this->pages;
        }

        public function setPages($pages) {
            $this->pages = $pages;
        }

        public function getPublisher() {
            return $this->publisher;
        }

        public function setPublisher($publisher) {
            $this->publisher = $publisher;
        }

        public function getBinding() {
           return $this->binding;
        }

        public function setBinding($binding) {
           $this->binding = $binding;
        }
}
?>
        


  1. 2 Trackback(s)

  2. Jul 1, 2009: アマゾンAPIの電子署名添付:日本語文字をURL-Encodeしておくことが必須 | Yama's Memorandum
  3. Oct 28, 2011: 自宅サーバー構築・覚書きリスト | Yama's Memorandum

Post a Comment