アマゾン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; } } ?>
2 Trackback(s)