検索 - Amazon ECS

 

認証と ISBN-13 に対応したコードを Amazon Product Advertising API (認証対応) に掲載しました。 使用している Operation は ItemLookup のみです。

2009-05-13

Amazon ECS へ RESTリクエストするサンプルです。

Amazon ECS へのリクエスト方式としては REST と SOAP がありますが、 よく利用されている REST のみ取り上げることにしました。 もし、SOAP を使用するのであれば「検索 - Google SOAP Search API」 が参考になると思います。

Amazon ECS の利用制限には、毎秒1コールを超えてはいけないというルールがあります。

サンプルを動かすには、 Access Key IDを取得 する必要があります。

ItemSearch

ソースコード

「プログラミング」「OS」の2つのブラウズノードから、 それぞれ1ページ(10件)ずつ書籍情報を取得します。 取得した書籍情報から「発売日」「ASIN」「書名」を取り出して表示します。

パラメータ AWSAccessKeyId には、開発者が個別に取得した Access Key ID を設定します。

amazon-search.rb
#!/usr/bin/ruby -Ku

require "net/http"
require "rexml/document"

Net::HTTP.version_1_2

node = [
    "492352",       # 本 > ジャンル別 > ... > プログラミング
    "492336"        # 本 > ジャンル別 > ... > OS
]

Net::HTTP.start("webservices.amazon.co.jp", 80) { |http|

    node.each { |browseNode|

        (1..1).each { |itemPage|

            path =  "/onca/xml",
                    "?Service=AWSECommerceService",
                    "&ContentType=text/xml",
                    "&AWSAccessKeyId=ABCDEFGHIJKLMNOPQRST",
                    "&Version=2005-10-05",
                    "&ResponseGroup=Medium",
                    "&Operation=ItemSearch",
                    "&SearchIndex=Books",           # 書籍
                    "&ItemPage=#{itemPage}",        # 取得するページ
                    "&BrowseNode=#{browseNode}",    # ブラウズノード
                    "&Sort=daterank"                # 発売日の新しいものから

            doc = REXML::Document.new http.get(path).body

            doc.elements.each("ItemSearchResponse/Items/Item") { |item|
                print item.text("ItemAttributes/PublicationDate"), " : "    # 発売日
                print item.text("ASIN"), " : "                              # ASIN
                print item.text("ItemAttributes/Title"), "\n"               # 書名
            }

            sleep 1    # 1リクエスト/秒以内のルールに従う
        }
    }
}

このサンプルでは、RESTリクエストを1秒間に1回以内に制限するために sleep を入れてあります。 もし、このサンプルがWebブラウザ経由で不特定多数から同時アクセスされることを想定するのであれば、 sleep とは別のロジックで対応する必要があるでしょう。

実行結果

$ ruby --version
ruby 1.8.5 (2006-08-25) [i386-linux]
$ chmod 744 amazon-search.rb
$ ./amazon-search.rb
2007-01-31 : 4798112089 : 組込みマルチタスクプログラミング実践講座
2007-01-06 : B000LXGZ1Y : 日経 Linux (リナックス) 2007年 02月号 [雑誌]
2006-12-27 : B000LUYOEM : DOS/V POWER REPORT (ドス ブイ パワー レポート) 2007年 02月号 [雑誌]
2006-12-27 : B000LXS5HQ : DOS/V MAGAZINE (ドスブイマガジン) 2007年 02月号 [雑誌]
2006-12-25 : B000LC549O : Interface (インターフェース) 2007年 02月号 [雑誌]
2006-12-23 : 4797339616 : ロールプレイングゲームプログラミング 2nd Edition
2006-12-22 : B000LC54AS : Windows Server World (ウィンドウズ・サーバー・ワールド) 2007年 02月号 [雑誌]
2006-12-22 : B000LRYAN0 : ネットワークマガジン (NETWORK MAGAZINE) 2007年 02月号 [雑誌]
2006-12-19 : 4894717239 : OpenGLプログラミングガイド 原著第5版
2006-12-19 : 4873113121 : Railsレシピ
2007-01-25 : 4798104434 : 独習Linux
2007-01-06 : B000LXGZ1Y : 日経 Linux (リナックス) 2007年 02月号 [雑誌]
2006-12-18 : B000LE0RVC : UNIX MAGAZINE (ユニックス マガジン) 2007年 01月号 [雑誌]
2006-12-08 : B000KRN6MM : 日経 Linux (リナックス) 2007年 01月号 [雑誌]
2006-12-06 : 4844323318 : できるPRO Fedora Core 6 Linux完全活用編
2006-12 : 4274501124 : 自治体にオープンソースソフトウェアを導入しよう!―デスクトップ編
2006-12 : 483992144X : Vine Linux 4.0スターターキット
2006-12 : 4797331453 : まるまるUNIXUSER 2003 (2003)
2006-11-24 : B000K4X6WK : Linux WORLD (リナックス・ワールド) 2007年 01月号 [雑誌]
2006-11-21 : 4797338962 : はじめてのFedora Core 6

ItemLookup

ソースコード

1度のリクエストの中で10件(最大10件)の ASINコードを指定して、 それぞれの書籍情報を取得します。 取得した書籍情報から「発売日」「ASIN」「書名」を取り出して表示します。

パラメータ AWSAccessKeyId には、開発者が個別に取得した Access Key ID を設定します。

amazon-lookup.rb
#!/usr/bin/ruby -Ku

require "net/http"
require "rexml/document"

Net::HTTP.version_1_2

asin = [
    "4881665316", "4844322222", "4896273052", "4534040784", "4774127728",
    "4839920354", "4774125792", "489362234X", "4798011967", "4797332646"
]

Net::HTTP.start("webservices.amazon.co.jp", 80) { |http|

    path =  "/onca/xml",
            "?Service=AWSECommerceService",
            "&ContentType=text/xml",
            "&AWSAccessKeyId=ABCDEFGHIJKLMNOPQRST",
            "&Version=2005-10-05",
            "&ResponseGroup=Medium",
            "&Operation=ItemLookup",
            "&ItemId=#{asin.join(',')}"

    doc = REXML::Document.new http.get(path).body

    doc.elements.each("ItemLookupResponse/Items/Item") { |item|
        print item.text("ItemAttributes/PublicationDate"), " : "    # 発売日
        print item.text("ASIN"), " : "                              # ASIN
        print item.text("ItemAttributes/Title"), "\n"               # 書名
    }
}

実行結果

$ ruby --version
ruby 1.8.5 (2006-08-25) [i386-linux]
$ chmod 744 amazon-lookup.rb
$ ./amazon-lookup.rb
2006-03 : 4839920354 : Ajax逆引きクイックリファレンスWeb2.0対応for Windows & Macintosh
2006-05 : 4896273052 : Ajaxハッカーズ・プログラミング―基礎からprototype.js、Yahoo!UIライブラリ、HTML_AJAXの活用までWebアプリケーション制作のプログラミング・テクニック
2006-05-13 : 4774127728 : 実例で学ぶ! [入門と実践] Ajax+XML [CD-ROM付き]
2005-11-15 : 4797332646 : 入門 Ajax
2006-06-09 : 4844322222 : Ajaxイン・アクション
2005-12-09 : 4798011967 : AJAX Webアプリケーション アイデアブック
2006-06 : 4881665316 : 実践Web2.0 Ajaxプログラミング入門
2006-05-31 : 4534040784 : 図解でわかる Ajaxのすべて
2006-03-23 : 4774125792 : Ajax 実装のための基礎テクニック
2006-03-08 : 489362234X : はじめに読みたいAjax ~入門から実践まで~

更新履歴

日付 内容
2006-08-09 変更 ライブラリを open-uri から net/http へ変更
2006-06-19 追加 ItemLookup のサンプルを追加
2006-05-16 初版