Python で Amazon ECS 4.0 にアクセスしてみる

参考にしたところ


Python から Amazon E-Commerce Service (ECS) にアクセスするライブラリは、今のところこれくらいしか見つからない。

pyamazon は AWS 3.0 を使用する上に、仕様が微妙で使いにくい。
pyaws はドキュメントも見つけられなかった。


なので、Python の勉強を兼ねて作ってみた。(機能は貧弱なのでLiteとしておく...)
ECS のバージョン 2004-10-04 に対応してるけど、2006-11-14 でも動くっぽい。


ダウンロードはこちら → pyAmazonLite.py
Python 2.4 + ElementTree または Python 2.5 が必要です。

使い方

Amazon Webサービスの登録ID(Subscription ID)が必要。→ 登録はここ

簡単な使い方はこんな感じ。

>>> from pyAmazonLite import *
>>> amazon = Amazon(license = '...') # your license key
>>> result = amazon.search('Python') # search "Books" by default
>>> print result.totalPages
2
>>> print result.totalResults
14
>>> print result.items[0].ASIN
4873112109
>>> print result.items[0].ItemAttributes.Title
初めてのPython 第2

Amazon クラスのメソッド search は EcsResult クラスを返す。
引数はこんな感じで、keyword , asin , browseNode のうち最低1個は指定する必要がある。

keyword
検索したいキーワード
asin
検索したいASIN番号
browseNode
Amazonのカテゴリごとの番号
response
取得したい情報。("Small" by default)
page
取得する検索結果のページ指定("1" by default)
operation
問い合わせの種類(今のところ指定しても無視される)
search
商品の種類(asin に値を指定したら無視される)("Books" by default)
content
フォーマット("text/xml" by default)
xslt
XSLTファイルのURL
sort
ソート方法


EcsResult のアトリビュートはこう。

errors
pyAmazonLite.EcsItem (エラー時以外はNone)
items
pyAmazonLite.EcsItem のリスト
requestURL
文字列(リクエスト先のURL)
totalPages
文字列(ItemSearchResponse/Items/TotalPages の値)
totalResults
文字列(ItemSearchResponse/Items/TotalResults の値)

items は検索結果の商品の情報(ItemSearchResponse/Items/Item の値)を表していて、返却されたXMLの構造となるべく同じようにした。
XML要素と EcsResult.items 以下の構造は以下のように対応する。

子要素を持つ要素
EcsItem
子要素を持たず、属性も持たない要素
文字列
子要素を持たないが属性を持つ要素
EcsNode


EcsItem と EcsNode は辞書を継承していて、アトリビュートのように値にアクセスできる。

>>> print result.items[0].ItemAttributes.Title
初めてのPython 第2版
>>> print result.items[0]['ItemAttributes']['Title']
初めてのPython 第2


Creator のようにXML要素が複数個ある可能性がある場合、Creators というリストに格納される。
pyamazon と違って、単数の場合でもリストに格納される。

>>> for c in result.items[0].ItemAttributes.Creators:
	print u"%s : %s" % (c.Role ,c.text)

著 : マーク ルッツ
著 : デイビッド アスカー
原著 : Mark Lutz
原著 : David Ascher
翻訳 : 夏目 大


検索パラメータがおかしい場合のエラーメッセージはこんな感じで取得できる。

>>> result = amazon.search(asin='invalid-asin')
>>> if result.errors:
	print result.errors.Error.Message
	
INVALID-ASINは、ItemIdの値として無効です。値を変更してから、再度リクエストを実行してください。