edo1z blog

プログラミングなどに関するブログです

Product Advertising APIで効率よくItemSearchする(GAE×Python2.7)

こんばんは。タイトルのとおり効率よくItemSearchしたいと思ってます。
効率よくも何もないとお思いになられるかもしれませんが、本、DVD、おもちゃ、ホビー、TVゲームが全て検索できるItemSearch関数を作ろうということです。

私は本しかやったことなかったので、他のものも検索するにあたって、全て別の関数つくってたんじゃたまりません、ということで、全てを効率よく問題なく検索できる関数の姿を明らかにしようと思ってます。

今ここに本を検索する為の関数があります。

def bookSearch(browseNode,page,minPrice):
    pyzon = Pyzon(access_key_id, secret_access_key, associate_tag)
    xml = pyzon.ItemSearch(
                           search_index='Books', BrowseNode=str(browseNode),
                           ItemPage=str(page),Condition='All',MerchantId='All',
                           ResponseGroup='Small,SalesRank,Images,OfferSummary',
                           Sort='salesrank',MinimumPrice=str(minPrice)
                           )
    xml = urllib.unquote(xml)
    soup = BeautifulStoneSoup(xml)
    return soup


ご覧いただくと分かるかもしれませんが、pyzonとbeautifulsoupを使ってます。 ブラウズノードIDと、ページ、最低価格を引数にとり、検索をかけて、その結果をBeaftifulSoupのクラスにして返却しています。

さて、同じ引数でDVD、おもちゃ、ホビー、TVゲームも検索できるようにするには、今設定しているオプションが本以外でも問題なく使用できることを確認する必要があります。また、search_indexは、必ず設定しないといけないみたいですので、search_indexの値も引数にしないといけないのではないかと思ってます。



ItemSearch では、サーチインデックスの他に、1つまたは複数のパラメータ値を指定する必要があります。


さて、本以外でつかえる検索オプションを確認する為には、『SearchIndex-ItemSearch パラメータの組合せ (JP)』をみれば一目瞭然であります。

おおおお、DVDではなんと、最低金額設定ができないようです!

本(Books)DVD(DVD)TVゲーム(VideoGames)おもちゃ(Toys)ホビー(Hobbies)
Author, BrowseNode, Condition, ItemPage, Keywords, MaximumPrice, MerchantId, MinimumPrice, Power, Publisher, Sort, TitleActor, AudienceRating, Availability, BrowseNode, Count, Director, Format, ItemPage, Keywords, Magazines, Performer ,PostalCode, Publisher, Sort, State, TitleBrand, BrowseNode, Condition, ItemPage, Keywords, Manufacturer, MaximumPrice, MerchantId, MinimumPrice, Sort, TitleBrowseNode, Condition, ItemPage, Keywords, Manufacturer, MaximumPrice, MerchantId, MinimumPrice, Sort, TitleBrowseNode, Condition, ItemPage, Keywords, Manufacturer, MaximumPrice, MerchantId, MinimumPrice, Sort, Title


でも、このドキュメント古いから、一応試してみよう。DVDだけできないというのはおかしい。 やってみたら出来た。なんだかな。要するに、上記の本用の関数を引数にsearch_indexを加えるだけで問題ないらしい。まあ後は、レスポンスの取り方としては、大体全部同じなんだけど、itemattributesが、authorじゃなくてactorだったり、actorは複数あったりするのでこの辺りのレスポンスの取り方を注意すれば全然問題ないようだな。

ということで下記のようになりました。

def itemSearch(searchIndex,browseNode,page,minPrice):
    pyzon = Pyzon(access_key_id, secret_access_key, associate_tag)
    xml = pyzon.ItemSearch(
                           search_index=searchIndex, BrowseNode=str(browseNode),
                           ItemPage=str(page),Condition='All',MerchantId='All',
                           ResponseGroup='Small,SalesRank,Images,OfferSummary',
                           Sort='salesrank',MinimumPrice=str(minPrice)
                           )
    xml = urllib.unquote(xml)
    soup = BeautifulStoneSoup(xml)
    return soup

なんかどうってことないことでしたね。