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

Python で Product Advertising API を試そうとしたら嵌った件

Product Advertising API を使った Web サービスを作って小遣いを稼いでやる!」っていうのは半分冗談で、半分本気。Web サービスを作るってのが本気で、小遣い稼ぎが冗談。そんなに甘いモンじゃないからね。

PythonProduct Advertising API を呼び出すためのライブラリは色々あるけど、その中でも PyPI で一番ダウンロードされている python-amazon-product-api ってのが良さそうだ。インストールは pip 一発。

pip install python-amazon-product-api

Product Advertising API のレスポンスは XML で、その XML を解析するために python-amazon-product-api は内部で lxml を使っている。当然、lxml も入れないとダメ。

Mac や Linux なら pip で一発インストールなんだろうけど、あいにく Windows だと zlib やら libxml2 やら諸々無いので失敗してしまう。必須ライブラリの入れるのも、手順が超面倒。幸い、PyPI にバイナリや Windows 用インストーラーが置いてあるから、今回はそれを利用しておく。lxml2.3 しかないけどな!

前置きが長くなってしまった。ようやく準備完了。さっそく、Amazon.jp にある Python 本を検索するスクリプトを書いてみた。

# -*- coding: utf-8 -*-
from amazonproduct import API, AWSError

ACCESS_KEY = "AWSのアクセスキー"
SECRET_KEY = "AWSのシークレットキー"
ASSOCIATE_TAG = "アフィリエイトID"

# ASSOCIATE_TAG も指定すること
api = API(ACCESS_KEY, SECRET_KEY, "jp", ASSOCIATE_TAG)
try:
    # 1ページだけ取得する
    for page in api.item_search("Books", Keywords="Python", limit=1):
        # 該当製品の総数
        print("total results: %s" % page.Items.TotalResults.pyval)
        # ページの総数
        print(page.Items.TotalPages.pyval)
        # ページ内の製品を列挙する
        for product in page.Items.Item:
            print('%s: "%s"' % (product.ItemAttributes.Author, product.ItemAttributes.Title))
except AWSError, e:
    print("code:%s message:%s" % (e.code, e.message))

ACCESS_KEY や SECRET_KEY は、あらかじめ Product Advertising API のアカウントを作成して入手してある。

実行したらこんな感じ。

total results: 264
total pages: 27
辻 真吾: "Pythonスタートブック"
Tarek Ziade: "エキスパートPythonプログラミング"
Mark Lutz: "初めてのPython 第3版"
細田 謙二: "Python入門―2&3対応"
ビープラウド: "Pythonプロフェッショナルプログラミング"
柴田 淳: "みんなのPython"
柴田 淳: "みんなのPython 改訂版"
Alex Martelli: "Python クックブック 第2版"
柏野 雄太: "Python ポケットリファレンス (Pocket Reference)"
Guido van Rossum: "Pythonチュートリアル 第2版"

検索結果の1ページ目を表示することに成功した。でも、たったこれだけのサンプルを書くのに1時間以上かかってしまった…。

最初、下記の Example を写経したんだけど、

Example のままだと

AttributeError: 'LxmlItemSearchPaginator' object has no attribute 'Items'

っていうエラーになった。どうやら、LxmlItemSearchPaginator は for でページを取り出してやらないといけないみたい。Example の方を修正しておいて欲しいよ。まったく。