読者です 読者をやめる 読者になる 読者になる

人工知能に関する断創録

人工知能、認知科学、心理学、ロボティクス、生物学などに興味を持っています。このブログでは人工知能のさまざまな分野について調査したことをまとめています。最近は、機械学習・Deep Learningに関する記事が多いです。



Amazon Web Serviceで書籍情報を取得する

日記

注意

2009/8/15からProduct Advertising APIの仕様が変更になりました。認証用のシグネチャをリクエストに添付する必要があるので下のコードに修正が必要です。

を参照してください。

本が大好きなのでiPhoneで蔵書管理アプリを作ろうかなと思ってる。iPhoneなので出先の本屋とか図書館でレビューを取得したり、積読リストに追加したり、感想をメモしたりできるような・・・あとレコメンデーションとか言語処理とか対話エージェントとか入れて少し知的にしたいなぁ。とあまり妄想を膨らませてもしょうがないのでとりあえずAmazonから書籍情報を取得する方法を調べてみた。iPhoneObjective-Cで書かなきゃだめだけどとりあえずPythonで。

Amazon Web Service (AWS) を使ったアプリを作るにはアクセスキーIDを取得しなくちゃいけないがAmazon Web Servicesのサイトから無料で取得できる。

AWSのAPIREST方式なのでURLにパラメータを指定してアクセスすると結果のXMLを返してきてくれる。たとえば、集合知プログラミング(2008/10/26)の情報をRESTで取得してみる。ブラウザに

http://webservices.amazon.co.jp/onca/xml?Service=AWSECommerceService&AWSAccessKeyId=XXXXXXXXXXXXXXX&Operation=ItemLookup&SearchIndex=Books&ResponseGroup=Large&IdType=ISBN&ItemId=9784873113647&ReviewPage=1

のようにパラメータを指定したURLを入れる。IdTypeにISBNという文字列、ItemIdには調べたい書籍のISBN(本の裏についてる10桁から13桁の数字)が入る。ResponseGroupには取得したい情報の種類によって変える。詳細情報はLarge。なおXXXXXXXXXXXXXXXの部分には先ほど取得したアクセスキーIDを入れる。このURLから返ってくるXMLから必要な情報だけ抽出すればよい。PythonでURLから情報を取得するのはurllib2、XMLのパースにはBeautifulSoupが使える。よしやってみよう。

#coding:utf-8
import urllib2
from BeautifulSoup import BeautifulStoneSoup

amazonurl = "http://webservices.amazon.co.jp/onca/xml"

request = (
    "Service=AWSECommerceService",
    "AWSAccessKeyId=XXXXXXXXXXXXXXX",       # 取得したアクセスキー
    "Operation=ItemLookup",                 # 商品の照会
    "SearchIndex=Books",                    # アイテムの種類
    "ResponseGroup=Large",                  # 取得するXMLに含めたい情報
    "IdType=ISBN",                          # ISBNで検索
    "ItemId=9784873113647",                 # ISBN(10桁,13桁どちらでもOK)
    "ReviewPage=1")                         # レビューが10個以上ある場合のページ数

url = amazonurl + "?" + "&".join(request)

# クエリをURLで渡すと結果がXMLで帰ってくる
xml = urllib2.urlopen(url).read()
soup = BeautifulStoneSoup(xml)

# itemタグ以下に書籍情報あり
item = soup.find("item")

# 商品情報
print item.asin                   # Amazon商品コード
print item.detailpageurl          # 商品ページのURL
print item.salesrank              # ランキング
print item.smallimage.url         # 小画像へのURL
print item.mediumimage.url        # 中画像へのURL
print item.largeimage.url         # 大画像へのURL
print item.largeimage.height      # イメージの高さ
print item.largeimage.width       # イメージの幅

# 商品属性
print item.itemattributes.findAll("author")         # 著者リスト
print item.itemattributes.binding                   # 種別
print item.itemattributes.findAll("creator")        # 作者
print item.itemattributes.ean                       # EAN
print item.itemattributes.isbn                      # ISBN
print item.itemattributes.edition                   # 版
print item.itemattributes.listprice.amount          # 価格
print item.itemattributes.listprice.currencycode    # 通貨単位
print item.itemattributes.listprice.formattedprice  # 単位を含めた価格表記
print item.itemattributes.publicationdate           # 出版日
print item.itemattributes.publisher                 # 出版局
print item.itemattributes.title                     # タイトル
print item.itemattributes.numberofpages             # ページ数
print 

# レビュー関係
print item.customerreviews.averagerating            # 平均レイティング
print item.customerreviews.totalreviews             # レビュー数
print item.customerreviews.totalreviewpages         # レビューページ数

# レビューを表示する
for review in item.customerreviews.findAll("review"):
    print review.rating     # レイティング
    print review.summary    # レビュータイトル
    content = review.content.contents[0]
    content = content.replace("<br />", "")
    print content           # レビュー内容
print

# 類似書籍を表示する
for similar in item.similarproducts.findAll("similarproduct"):
    print similar.asin      # 類似書籍のASIN
    print similar.title     # 類似書籍のタイトル

出力は下のようになる。

<asin>4873113644</asin>
<detailpageurl>http://www.amazon.co.jp/%E9%9B%86%E5%90%88%E7%9F%A5%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-Toby-Segaran/dp/4873113644%3FSubscriptionId%3D0CDQFTTPS2NZ96X08C02%26tag%3Dws%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4873113644</detailpageurl>
<salesrank>2370</salesrank>
<url>http://ecx.images-amazon.com/images/I/51FgSThMzVL._SL75_.jpg</url>
<url>http://ecx.images-amazon.com/images/I/51FgSThMzVL._SL160_.jpg</url>
<url>http://ecx.images-amazon.com/images/I/51FgSThMzVL.jpg</url>
<height units="pixels">500</height>
<width units="pixels">391</width>
[<author>Toby Segaran</author>]
<binding>大型本</binding>
[<creator role="翻訳">當山 仁健</creator>, <creator role="翻訳">鴨澤 眞夫</creator>]
<ean>9784873113647</ean>
<isbn>4873113644</isbn>
None
<amount>3570</amount>
<currencycode>JPY</currencycode>
<formattedprice>¥ 3,570</formattedprice>
<publicationdate>2008-07-25</publicationdate>
<publisher>オライリージャパン</publisher>
<title>集合知プログラミング</title>
<numberofpages>392</numberofpages>

<averagerating>4.0</averagerating>
<totalreviews>2</totalreviews>
<totalreviewpages>1</totalreviewpages>
<rating>3</rating>
<summary>私には敷居が高かったかも・・・</summary>
面白そうだな〜と思って購入しました。
が、ほとんど基礎知識のない私にはちょっと敷居が高かったかも・・・。

プログラムで実際に使う場面になったときに読み直したら非常に参考になるとは思います。そのときまでちょっと本棚に眠っていてもらいます。
<rating>5</rating>
<summary>応用しやすいアルゴリズム</summary>
プログラマあがりのマーケターとしては、本書は非常に楽しめました。

本腰入れて応用・展開していけば、飯を食っていけるような。。。
(もちろん発想力がないと無理でしょうが。。。)

【プログラマの方には・・・】
プログラムとマーケティングが直結する内容です。
集合知=Web2.0とするなら、まさにうってつけの3分レシピ集でしょう。
自分のプログラミングのマーケティングへの展開もしっかり見えるので、
マーケティング食わず嫌いの人には是非お勧めしたいです。
僕はついでにPythonも始めてしまい、はまってしまい、ちょっと仕事で必要なツールはPythonですぐに作れるので非常に楽しいです。
個人的な結論: やっぱりアルゴリズムは楽しい。

【マーケターの方には・・・】
ちょっとハードル高いかもしれませんが、簡単に言うとシステムの裏で何が起きているのかを体感できます。
Webに実装となると、そのまま使うにはちょっと簡単すぎますが、何が可能で何が考えうるのかを学べるはずです。
思想の展開力が問われる仕事なので、ここから新たな実行可能アイデアはいくつも思いつくはずです。

<asin>4873113784</asin>
<title>ビジュアライジング・データ &#8212;Processingによる情報視覚化手法</title>
<asin>4774135666</asin>
<title>[24時間365日] サーバ/インフラを支える技術 ~スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ) (WEB+DB PRESS plusシリーズ)</title>
<asin>487311361X</asin>
<title>ハイパフォーマンスWebサイト &#8212;高速サイトを実現する14のルール</title>
<asin>4431100318</asin>
<title>パターン認識と機械学習 下 - ベイズ理論による統計的予測</title>
<asin>4873113636</asin>
<title>ビューティフルコード</title>

思ってたほどたくさん取得できるなぁ。レイティングとかレビューとか似た本とかけっこう役立ちそう。titleとかのタグがいらない場合は、

print item.itemattributes.title.contents[0]    # タイトル

とcontents[0]をつければよい。画像はURLがわかるのでurllib2でアクセスしてjpegを取得できる。よし大体OK。次はCocoaでMac上のGUIアプリを作ってみるか。

追記

こーいう蔵書管理、レビュー取得系のアプリはすでにあるだろうなーと思って検索してみたらあった。BookReview。無料ということでさっそくインストールしてみたのだけど便利だ。ISBNを入れるとレビューを表示してくれてAmazonでも購入できるボタンがついてる。アプリレビューにはISBN入力が面倒とかあるけど出先で書籍を見ながら確認するには楽な方法だと思う。ブログによると蔵書管理システムとの連動、バーコードによる読み取りなども導入予定らしい。あー自分で作る気が失せてきた(笑)

関連リンク