ItemSearch取得ページ数の上限回避策(Amazon Product Advertising API)
- 2013年06月19日
- 雑記
Amazon Product Advertising API
Amazonのアソシエイトプログラムにメンバー登録すると、Product Advertising APIを通じてAmazonデータベースから商品の情報を取得できる。
私が作ったカイトランカーというサイトでは、このProduct Advertising APIでアマゾンからゲームの新品、中古価格や買取価格を取得して、ランキング化している。
先日カイトランカーの更新ログを眺めていたら、Playstation 2のゲームの情報が更新されていないことに気付いた。
どうやら1円で売られているゲームが多すぎて、ItemSearchというリクエストの返り値が上限を超えており、うまく取得できていないようだ。
今回はItemSearchでの返り値の制限をどう回避したかをメモしておく。
カイトランカーでの実装と問題点
2013年6月現在、ItemSearchで取得できるページ数の上限は10ページまでとなっている。11ページ目以降を取得しようとしてもエラーとなり検索結果を教えてくれない。
1ページには10アイテムの情報が載っているので、1度の検索で取得できる上限は100アイテムまでで、101アイテム目以降の情報を取得することは出来ない。
100アイテムを超えるような場合には、検索条件をもっと絞り込んで100アイテム以内になるようにしろ、という方針だと思う。
このような環境の中でカイトランカーでは、以下のように条件を指定してゲームを検索していた。
・ゲーム機の種別毎に分かれたbrowsenode番号を指定(playstation 2, XBOXなど)
・最安値の価格の上限
・最安値の価格の下限
もし検索結果が20ページを超えるようであれば、検索結果が20ページ以内に収まるように価格の上限を調整。
検索結果が20ページ以内になれば、ゲームタイトル名で昇順ソートして上から10ページを取得、次にゲームタイトル名で降順ソートして上から10ページを取得していた。
これでこの間まではうまく動いていたのだが、Playstation 2のソフトがさすがに売れなくなって来たのか1円出品が増えているようで、いつのまにか価格の上限1円、下限1円にしても20ページに収まらないほどの数のゲームが検索に引っかかるようになってしまい、エラーで止まっていたのだった。
検索条件を変更
これ以上価格で絞り込むことができない以上は、価格以外の条件で絞り込みを行わないといけない。
ItemSearchでゲーム(VideoGames)を検索するときには以下の条件が指定できる。
- Brand:商品に関連したブランド名
- BrowseNode:商品の種別を識別する番号
- Condition:商品の状態(新品、中古など)
- ItemPage:結果の何ページ目を取得するか
- Keywords:検索したい語句
- Manufacturer:商品に関連したメーカー名
- MaximumPrice:価格の上限
- MerchantId:マーチャントID(販売者のID?)
- MinimumPrice:価格の下限
- Sort:並び順
- Title:検索するタイトル名
いろいろ試した結果、Brand名を検索条件に付加することで1円の商品の検索を複数に分割することにした。
Brand名の条件には、アで始まるBrand名を指定する「ア*」のようなアスタリスクでの指定や、AND、ORでの複数の条件指定ができる。
そこで例えば、1円商品が20ページ(200件)を超える場合、Brand名が「ア」で始まる商品とそれ以外
1. Brand=ア*
2. Brand=-ア*
の二つの検索に分割する。
1.の方の結果はさすがに20ページを超えることはないだろうから、そのまま処理(これが20ページを超えるようなら更に細かくしないと。。。)。
2.の方の結果がまだ20ページを超えている場合、Brand名が「イ」で始まる商品とBrand名が「ア」「イ」以外で始まる商品の二つの検索に分割。
2-1. Brand=イ*
2-2. Brand=-ア* -イ*
こんな感じで、すべての検索の結果が20ページに収まるように検索条件を細かく分割していくことにした。
最初は1回目の検索で「ア* | イ* | ウ* | エ* | オ*…..」のORと「-ア* -イ* -ウ* -エ* -オ*….」のAND指定でざっくり分けることも考えたが、なぜか「|」で指定するORの条件がうまく処理されていないように見えるのでこの方法は採用しなかった
これでなんとか検索結果をすべて取得できるようになった。