Subscribed unsubscribe Subscribe Subscribe

AmazonのAPI(通称Amazon Product Advertising API)覚え書き

仕様書が1ページに収まるTwitter APIと違って、AmazonのAPIの公式Developer GuideはPDFにして600ページ以上にもなります。しかしこれを読まずとも、Amazon APIについてよくまとめられたサイトはたくさん存在するので、自分が特に何度も参照したサイトをここにまとめてみようと思います。
他の誰かが、自分の知識を再利用してくれることで、自分と同じ時間・労力を使わずに済んでくれることを願い。

役に立ったサイト

Amazon Web サービス入門(Product Advertising API)

http://www.ajaxtower.jp/ecs/

親切で詳しい解説で、Amazon APIの全体像がつかめます。APIというものにはじめて触れる方はまずここから入るといいと思います。途中からXML/XSLTの解説になりますが、ライブラリを使ってAPIを取得するのであればそれ以降は読み飛ばしてOK かと。

これ以降は、APIPHPのServices_Amazon等のライブラリを使って受け取る方向けに書いていきますが、もしXMLのまま開発をする方であれば俺流amazonの作り方―Amazon Webサービス最新活用テクニックを手元に置いておけば心強いと思います。この本はPerlでAmazon APIXMLのまま、XMLで整形するなどして扱う方法について解説した本だからです。(もし上のサイトの内容が十分理解できる方であれば、内容はだいたい重複しているので必要ないと思いますが。)

ちなみに自分は、最初はここの解説を見ても理解できなかった(「リクエスト」や「パラメータ」等の言葉の意味がまずさっぱり分からなかった)ので、ZAPAさんの公開APIを利用したサンプルサイトを作っていくよライブドア天気やフォト蔵APIを解説に沿って使ってみることで、APIというものに慣れていきました。

Services_Amazonのドキュメント

http://pear.php.net/package/Services_Amazon/docs/0.8.0/Services_Amazon/Services_Amazon.html

APIというものを使い慣れた方であればこれだけ参照すれば大丈夫なのかな。

Amazon Product Advertising API公式ドキュメント

http://developer.amazonwebservices.com/connect/entry.jspa?externalID=3426&categoryID=19

すごい量ですが、辞書的な用途で使っていました。たとえばResponseGroup等はくっつけるオプションパラメータ(ItemSearch, Reviews, BrowsenodeLookup)に対して指定できるものがいちいち変わってくるので、「あれ、ここで指定できるResponseGroupは何だっけ?」というのを確認するのに使っていました。
また、ResponseGroupの種類などについては、id:yuku_tさんのItemLookupのまとめResponseGroupsの種類ItemSearchのまとめもとても参考になります。

APIの注意点

Amazon APIでクローラなどを使った開発をする際には、次の3つのAPI制限が壁になるので覚えておくと◯だと思います。

(1) 1秒に1回以上リクエストしてはいけない

1秒以内の間隔でリクエストしまくると505が返るみたいです。
クローラなどのスクリプトで、1回の実行で複数回連続してAPIにアクセスする場合は、

while ( ) {

    $time2 = microtime();

    if ( $time2 - $time1 < 1秒 ) {
        usleep(1秒 - ( $time2 - $time1) );
    }

    ////////////////////////
    // ここにAPI呼び出し処理(doBatchやItemSearchなど)
    ////////////////////////

    $time1 = microtime();
}

のようにすれば、この制限は守れます。
ただ、さくらインターネットなどはcronのタイムアウトが早いので、あまり処理時間の長いスクリプトだと、実行が最後まで到達するまでにタイムアウトになってしまうので、ループはかなり少なめにしておいたほうがいいかも。。。

(2) ItemSearchオペレーションで取得できるのは4,000商品分まで

これが一番厄介です。何万件と商品データを取得してくても、1つの検索条件では4,000個しか取れない。

なおオペレーションとしてItemSearchを使用する場合、ページ数の最大数は400ページとなっています。つまり400×10=4000個以上の検索結果が返されるようなリクエストを送信し、401ページ目のデータを参照しようとするとエラーとなります。このような場合はより条件を絞ったリクエストを作成する必要があります。

商品数とページ数 - ページ管理 - Amazon Web サービス

自分は「複数のノード(ジャンル)から4,000個ずつクロールする」という方法でなんとかこの制限を突破しました。どの商品も10〜20くらい所属ノードを持っているので、商品数を多く含むノードを上から4,000個クロールすれば、そこそこ人気の書籍であればほぼ漏れなく網羅できたように感じました。ちなみにAmaSearch+は、のべ300個の主要ノード*1について、そのノードが含む商品数に応じて40〜4,000個の商品をクロールするようになってます。

(3) 1. 24時間に10,000回以上リクエストしてはいけない

昔はあったようですが、前に規約を読んだときにはこの制限は含まれていませんでした。一応守るようにはしていますが。

とりあえず今のところはここまで

作業日誌代わりにしてるブログの記録もたどってみて、他にここに付け足すべきことがあれば追記していこうと思います。

*1:ノードは推定で数千個存在すると思われるので、流石にすべてのノードをクロール対象にはできませんでした。