PyAmazon
http://www.josephson.org/projects/pyamazon/
v0.65 についてのメモ.仕様が割とひどい.
基本
以下は amazon.co.jp から「のだめ」を検索した結果を適当に出力する例.
import amazon LOCALE = 'jp' ACCESS_KEY = 'your access key' amazon.setLocale(LOCALE) amazon.setLicense(ACCESS_KEY) data = amazon.searchByBlended(unicode('のだめ', 'euc-jp').encode('utf-8')) for p in data.ProductLine: details = p.ProductInfo.Details # for d in details: for key, val in d.__dict__.iteritems(): print '%(key)s: %(val)s' % locals()
searchByKeyword の罠
searchByKeyword 関数で,あるカテゴリの中から検索することができる.
- しかし,searchByBlended と違って data をそのまま返さずに data.Details を返しやがる (amazon.py の 312 行目を参照) ので,searchByKeyword を使うと,TotalPages や TotalResults を得ることができない.
- さらに,searchByKeyword の引数に,デフォルトで product_line="books" というのが入っているが,ロケールを jp にした場合はこれだと正しく検索できない.jp ロケールで有効な product_line は以下の通り (たぶん).
モード | 内容 | モード | 内容 |
books-jp | 和書 | books-us | 洋書 |
music-jp | ポピュラー音楽 | classical-jp | クラシック音楽 |
dvd-jp | DVD | vhs-jp | ビデオ |
electronics-jp | エレクトロニクス | kitchen-jp | ホーム&キッチン |
software-jp | ソフトウェア | videogames-jp | ゲーム |
magazines-jp | 雑誌 | toys-jp | おもちゃ&ホビー |
photo-jp | ? | pc-hardware-jp | ? |
searchByBlended の罠
searchByBlended 関数は Amazon に対して全体検索をかけることが可能.
searchByKeyword のように,この関数にも引数に page というのがあるが,ページ指定はできない.何のための引数なのか,かなり謎.
もっとも,searchByBlended の場合にページ指定ができないのは Amazon API 側の仕様のようだが.
データの整合性
属性の有無
PyAmazon は内部で Amazon API の XML を呼び出して xml.dom.minidom で解析した後,unmarshal という関数で階層構造に沿ってオブジェクトを作っている.そのため,XML の構造がそのまま Python のオブジェクトに継承されている.
そのせいか,結果によってあったりなかったりする属性があるので,適切なエラー処理を書く必要がある.
data = amazon.searchByBlended(unicode('のだめ', 'euc-jp').encode('utf-8')) d = data.ProductLine[0].ProductInfo.Details[0] d.ProductDescription # AttributeError を引き起こす可能性が高い getattr(d, 'ProductDescription', None) # こちらの方が安全
ちなみに,pydoc に書いてある,属性として含む可能性のあるものは以下の通り.
属性名 | 内容 | 属性名 | 内容 | 属性名 | 内容 |
Asin | Amazon の ID | Authors | 著者リスト | Availability | 「○日以内に発送」など |
BrowseList | 関連のあるカテゴリのリスト | Catalog | カタログのタイプ (Book など) | CollectiblePrice | 価格? |
ImageUrlLarge | 画像 URL | ImageUrlMedium | 画像 URL | ImageUrlSmall | 画像 URL |
Isbn | ISBN 番号 | ListPrice | 価格? | Lists | ? |
Manufacturer | 出版社 | Media | メディア(「音楽CD」など) | NumMedia | メディアの数(CD何枚,など) |
OurPrice | Amazon での価格 | ProductName | アイテムの名前 | ReleaseDate | リリース日 |
Reviews | レビュー | SalesRank | 順位 | SimilarProducts | 関連のあるアイテムのリスト |
ThirdPartyNewPrice | 価格? | URL | Amazon の URL |
が,以上にリストされていない属性も多々あるので以下に少し補足しておく.
属性名 | 内容 | 属性名 | 内容 |
ProductDescription | 商品の説明 | Artists | アーティスト名 (Authors とは別) |
Tracks | CD等の場合のトラック名リスト | Platforms | 動作環境 |
型の整合性
たとえば Artists.Artist の中身が list になったり str になったりする.ちゃんと処理してやらないとハマる.
ATTRS = ['Authors', 'Artists', 'Tracks'] data = amazon.searchByKeyword(unicode('のだめ', 'euc-jp').encode('utf-8'), product_line='classical-jp') for attr in ATTRS: print '%s: ' % attr for d in data: authors = getattr(d, attr, None) # if isinstance(authors, amazon.Bag): authors = getattr(authors, attr[:-1], None) # if isinstance(authors, list): # リストの場合 for a in authors: print ' ', a # elif authors is not None: # リストでも None でもない場合は str と仮定 print ' ', authors