Amazonから詳しい書籍情報を取得し、DBに入れる

書籍の詳細情報をDBに入れる

これまでの成果により、ラノベの新着が取れるようになったので、次は取ってきた情報をDBに突っ込むようにする。

スキーマ

テキトーなので深く考えていないが、以下ぐらいは欲しい。

  • 著者
  • タイトル
  • 作品紹介
  • 値段
  • 出版日
  • 画像URL
  • 商品詳細のURL

注意:キャッシュ制限

Amazon利用規約によると、キャッシュは24時間までしか認められていない。値段や商品リストが変動するからとのこと。

ResponseGroup

上で挙げた作品紹介や画像URLなどは、デフォルトではAPIのレスポンスに含まれていないため、含んでもらえるように指定する必要がある。この指定をResponseGroupと言う。

ResponseGroupに指定できる値は複数存在し、例えば、画像URLが欲しい、値段が欲しい、などと細かく指定できる。グループは組み合わせで指定することも可能。

デフォルトではSmallというグループになっていて、これはいくつかのグループの組み合わせになっている。今回はその1つ上のMediumを使う。

http://docs.aws.amazon.com/AWSECommerceService/latest/DG/CHAP_ResponseGroupsList.html

注意:KindleStoreの商品の値段は取得できない

なんというか、驚くべきゴミさだと思うのだが、2014/06/02時点では、KindleStoreの商品はからは値段を取得できない。取得できないのである。驚くべきことに、取得できないのだ。

開発者から言わせてもらえば、正直「お前は何を言っているんだ」レベルだが、かなり長期に渡って放置されているので、戦略的に放置されているのではないかと思う。ないものねだりをしてもしょうがないので、値段はあきらることにした。

ちなみに、抜け道を探すために2時間ぐらい本件を調べていた。見た限りは抜け道はなく、徒労感が半端ではない。

出来上がったもの

スキーマができた。ポイントとしては、

  1. 著者は1つの本に対して複数存在する(共著であったり、イラストレーターなどが存在するので)。
  2. 画像URLはサイズで複数存在する。

ぐらいか。これらは1つの本に対して多関係にしておいた。もちろん、実際のモデルやDBスキーマはアプリケーションに合わせてもう少し複雑になっているのだが、ここで個別のケースについて話してもしょうがないので省略する。

プログラムは以下のようにresponse_groupを加えた形になる。

options = {
    country: 'jp',
    sort: 'daterank',
    browse_node: '2410280051',
    response_group: 'Medium',
}
res = Amazon::Ecs.item_search("", options)

ニートはお腹が減った。アニメも見たい。そろそろお昼休憩すべきである。