Python: Amazon Product Advertising APIを試す

AmazonのProduct Advertising API(PA-API)を利用して商品情報を得るPythonプログラムを試してみました。

1. Amazonアソシエイト

Amazonアソシエイトとは、つまるところアフィリエイトです。当サイト見た人がAmazonへのリンクをポチッて商品を買ってくれたら私に小銭が入る仕組みです。

まずは、アカウント(無料)を作成してアソシエイトIDをゲットしましょう。
あとは、こんな感じの出来合いのバナー広告をはってムフフ….。


2. Product Advertising API

出来合い広告だけじゃあ満足できない人が使うPA-API。

URLや価格などの商品情報を取得したり、ショッピングカートをコントロールしたり、カスタマーレビューをゲットしたりできるAPIです。プログラミングを要しますが、Amazonの商品情報を利用したWebサービスを作ることが出来ます。

商品情報の入手はHTTPのGETなので、今どきのプログラミング言語なら何でもOK。

APIを利用するために、アクセスキーIDとシークレットキーのペアを作成しましょう。

アソシエイトにログインして、「ツール」メニューから「Product Advertising API」を選択

 

アクセスキーIDとシークレットキーを作成

 

PA-APIの利用ポリシーを厳守しましょう。なお、最近、重要な変更がありました。

[重要] Product Advertising API 利用ポリシーの変更について

日程変更のお知らせ
当初変更日程を2019年01月16日としておりましたが、2019年01月23日に変更いたします。

変更内容について
Product Advertising API (以下PA-API)ではこれまで全てのお客様に初期状態にて1秒間に1リクエストのサービス提供をしてまいりました。
2019年01月23日よりこの条件を変更し、過去30日以内の発送済み売上商品が発生している場合、1日のリクエスト上限を8,640リクエストとし、追加の日次リクエスト可能数の上限を毎日動的に変更する下記仕様といたします。

初期リクエスト可能数 : 1日あたり 8,640リクエスト(API利用開始より60日間)
PA-APIより取得した商品リンクより発生した、過去30日間の発送済み商品売上$0.05(日本円で約5円)ごとに1リクエスト追加
1日の最大リクエスト可能数は、1日あたり864,000リクエスト

売上実績の発生がない場合は、PA-APIの利用開始はできません。
また、発送済み商品売上が過去30日以内に発生していない場合、PA-APIをご利用いただけなくなる恐れがございます。

なお 、Amazon Link Builder(WordPressプラグイン)のご利用についても、先に挙げた条件が適用となり、売上実績が必要となります。

集客力の無いサイトはAPIを使えなくなります。ひぇ!

1日当たりのアクセス数は8,640に激減しました。過疎っている当サイトにはノーダメですが。

1アクセス/秒の制限も地味に問題です。複数のアフィを貼ったページへアクセスしたときにポリシーに違反するケースが考えられるので。

アクセス制限に引っかかると503エラーが発生して商品情報をもらえなくなるので、商品情報をキャッシュする、排他ロックで同時API利用を抑制する…などの仕組みが必要ですね。

3. Pythonによる商品情報の入手方法

HTTP GETなので、Python公式urllibや定番Requestsが使えます。だがしかし、無いものは無いPython、Amazonアソシエイト用のライブラリがすでに存在しますので利用しました。名前から機能を全く連想できませんね。

Bottlenose is a thin, well-tested, maintained, and powerful Python wrapper over the Amazon Product Advertising API. There is practically no overhead, and no magic (unless you add it yourself).

bottlenose
Amazon Product Advertising API Python Library

 

環境に応じて、pipやpipenvなどでインストールしましょう。

 

こんなコードで商品情報が得られます。

実行するコマンド。

アソシエイトID(AssosiateId)とアクセスキーID(AWSAccessKeyId) はパブリックなので晒しても大丈夫。ナイショにする必要があるのはシークレットキー(AWSSecretKey)だけです。
さっき、アクセスキーIDを塗りつぶしたけど無駄でした。

ItemLookup()で得られる商品情報はbytes型なので、decode()でデコードしてstrに変換しています。

さて、Amazonから受け取ったレスはタグまみれのXMLです。欲しい情報を何とかして抽出する必要があります。

4. XMLから欲しいデータを抽出する方法

Beautiful Soupっての使います。石けんではなくスープです。

XMLやHTMLをパースして、欲しい情報をぶっこ抜くことが出来る便利ライブラリです。スクレイピングってやつです。

Beautiful Soup is a Python library for pulling data out of HTML and XML files. It works with your favorite parser to provide idiomatic ways of navigating, searching, and modifying the parse tree. It commonly saves programmers hours or days of work.

Beautiful Soup Documentation

Beautiful Soupのドキュメントによると、現時点で使えるHTMLパーサはPython組込みの他に複数ありますが、XMLパーサはlxmlのみです。なのでlxmlを使います。

lxml – XML and HTML with Python

lxml is the most feature-rich and easy-to-use library for processing XML and HTML in the Python language.

 

Beautiful Soupとlxmlのインストールは次のとおり。

 

さっきのプログラムをちょっといじました。bottlenose、Beautiful Soup、lxmlで商品情報を取得するプログラムです。

商品情報が収められた変数soupは、見た目は先ほどと同じくXML形式のstr型変数ですが、BeautifulSoupという全く違う型です。XMLのノードを探索して必要なデータをぶっこ抜くための多彩な方法が使えます。

例えば、商品が掲載されているURLは、次のようなコードで取得できます。
BeautifulSoup型は、タグ名で検索して中身を取り出すことができるのです。

商品タイトルは次のコードで見つかります。

商品名とそのURLがゲットできたので、↓のようにアフィリエイトリンクが出来上がり。

ボヘミアン・ラプソディ 2枚組ブルーレイ&DVD [Blu-ray]

 

さて、予備実験はここまで。
汎用的に商品情報を使えるように、辞書(dict)型変数にデータを格納するプログラムを作りました。

以上です。

 

Leave a Comment

メールアドレスが公開されることはありません。

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください