アマゾン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)