カテゴリー : Amazon

Amazon Product Advertising APIの仕様変更が2011年10月26日(水)に実施

 

Amazonの提供する、Product Advertising APIの仕様変更が、当初の予定通り2011年10月26日(水)に実施されるそうです。
 


 

仕様変更に先立ちProduct Advertising API開発者のみなさまに余裕を持ってご準備頂けるよう、実際の変更内容を体験頂く機会をご用意いたしました。
 

日程:

■2011年10月19日(水)午後3:00 – 午後7:00
 

期間中は仕様変更後と同じオペレーションおよびレスポンスグループを体験頂くことができます。

仕様変更の詳細については、以下のリンクをご参照ください。

Product Advertising API はてなブックマーク - Product Advertising API

Product Advertising API はてなブックマーク - Product Advertising API
 

以上です。
 

[PEAR] Amazon API の ItemSearch を使った複数キーワードでの検索方法

 

Amazon API を使える PEAR :: Services_Amazon の ItemSearch を使って、複数キーワードでの検索をしてみました。
 

・参考:Docs For Class Services_Amazon
 

ItemSearch の使い方サンプルは以下のようになっています。
 

1
2
3
4
5
6
7
8
9
10
11
<?php
 
$amazon = new Services_Amazon('[your Access Key ID here]', '[your Secret Access key here]');
 
$options = array();
$options['Keywords'] = 'sushi';
$options['ResponseGroup'] = 'ItemIds,ItemAttributes,Images';
 
$result = $amazon->ItemSearch('Books', $options);
 
 ?>

これの $options[‘Keywords’] の部分を下記のようにすれば、「書籍名」「著者名」「出版社名」と複数のキーワードで検索できます。
 

1
2
3
4
5
$title = '検索したい書籍名';
$author = '検索したい著者名';
$publisher = '検索したい出版社名';
 
$options['Keywords'] = $title . $author . $publisher;

 

このとき、キーワードに含まれる「書籍名」「著者名」「出版社名」は、検索時にAmazon側での区別はされていません。
 

Amazonには、これらの文字列3つを連結した文字列の内容で検索しています。
 

以上です。
 

[PEAR] Services_Amazon をインストールして Amazon API を使ってみました

PEARの Services_Amazon をインストールして Amazon API を使ってみました。

・参考:Amazon APIを使って簡単にランキングを取得する – EC studio 技術ブログ はてなブックマーク - Amazon APIを使って簡単にランキングを取得する - EC studio 技術ブログ
 

1. PEAR HTTP_Request2 のインストール

# pear install -a HTTP_Request2-alpha

※Services_Amazonで使用しているHTTP_Request内で使用しているので、まずこちらをインストール。

※インストールのバージョン(state)は最新のものを指定してください

※インストールする際に、依存するパッケージも合わせてインストールするため、オプションに「-a」を指定しています。

 

2. PEAR Services_Amazon のインストール

# pear install -a Services_Amazon-beta

 

3. ちゃんとインストールされたか確認

# pear list

以下の4つがインストールされていればOKです。(バージョンは、2011/05/17 時点)

Cache            1.5.6    stable
HTTP_Request2    2.0.0RC1 beta
Services_Amazon  0.8.0    beta
XML_Serializer   0.20.2   beta

 

以上です。
 

[Python] Amazon API で商品のコンディションコメントを取得してみた

 

Amazonマーケットプレイスに出品されている情報から「商品のコンディションのコメント」を取得する方法を調べたのでご紹介します。
 

その他に、商品の情報を取得したい場合も応用できます。
 

ちなみに今回は [Python] Amazon Product Advertising APIを使ってみました | CodeNote.net はてなブックマーク - [Python] Amazon Product Advertising APIを使ってみました | CodeNote.net にて、itemSearchのキーワードを”Python クックブック 第2版”に変更して、この本のマーケットプレイスから本のコンディションコメントを取得しました。
 

取得したい情報が「コンディションのコメント」なのですが、これはXMLの要素 ConditionNote に含まれています。要素は親要素から順番に以下のようになります。
 

<Items><Item><Offers> <OfferAttributes><ConditionNote>

 

よって、要素 ConditionNote の情報を取得したい時に、親要素 OfferAttributes を全て取得して、取得したデータから1つずつOfferAttributesの子要素である ConditionNote を見ていくようにしたらエラーがでました。
 

以下、エラーで、最初の方は出力できているのですが、途中から取得できませんでした。
 

$ python t_offerattributes_fail.py 
◆◆◆小口に汚れが有ります。カバーに使用感があります。他は問題ありません。迅速・丁寧な発送を心がけております。【日曜以外毎日発送】
エアキャップにて梱包し、速やかに発送します。
Traceback (most recent call last):
  File "t_offerattributes_fail.py", line 17, in <module>
    print item.conditionnote.contents[0]
AttributeError: 'NoneType' object has no attribute 'contents'

以下、失敗した場合のコードです。
 

■ t_offerattributes_fail.py
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#coding:utf-8
import sys, codecs
sys.stdout = codecs.lookup('utf_8')[-1](sys.stdout)
 
from amazon import Amazon
 
# キーワードで本を検索したい!
amazon = Amazon("自分のAccess Key", "自分のSecret Access Key")
xml = amazon.itemSearch("Books", Keywords=u"Python クックブック 第2版", ResponseGroup="OfferFull", MerchantId="All", Condition="All")  # 本の詳細な販売情報(OfferFull)
print amazon.url  # リクエストURL
print unicode(xml, 'utf_8')		# Amazonのレスポンス
 
# XMLから情報を取り出す
from BeautifulSoup import BeautifulStoneSoup
soup = BeautifulStoneSoup(xml)	# XMLをsoupに格納
 
# soupから要素 offerattributes の情報のみを取り出す
for item in soup.findAll("offerattributes"):
	print item.conditionnote.contents[0]
		# item要素以下の要素 conditionnote の内容を出力

 

要素 OfferAttributes の子要素に ConditionNote がないときがあるので、item.conditionnote.contents[0] の中身がないことでエラーになります。
 

よって、直接、要素 ConditionNote を取得すればいいわけです。
 

上記プログラムの最後の4行だけ以下のように書き換えれば上手く商品のコンディションコメントを取得できました。
 

1
2
3
4
# soupから要素 conditionnote の情報のみを取り出す
for item in soup.findAll("conditionnote"):
	print item.contents[0]
		# item要素以下の要素 conditionnote の内容を出力

以下、出力された情報です。
 

$ python t_offerattributes_true.py 
◆◆◆小口に汚れが有ります。カバーに使用感があります。他は問題ありません。迅速・丁寧な発送を心がけております。【日曜以外毎日発送】
エアキャップにて梱包し、速やかに発送します。
新品未読品です。在庫確実。迅速発送いたします。
新品未読品の状態の書籍です。水濡れ防止にて丁寧に梱包し、迅速に発送いたします。(原則3営業日以内)在庫切れ時は速やかにご注文をキャンセルさせて頂きます。定価より高価になっている場合がございますので、必ず定価をご確認ください。 (土、日、祝は原則お休みです。)
新品未読の商品ですので非常に綺麗です。迅速丁寧に対応いたします。International shipping available.
★初版。カバーに極小ヨレあり。中身文面綺麗です。エアーパッキンにて梱包し迅速に発送致します。★
新品美品です。ビニール梱包、メール便にて迅速発送させていただきます。(ご注文をいただいた時間にもよりますが、翌日〜一週間の発送になります)品切れの場合はご了承下さい。希少品につき、若干定価より高めになっておりますが、ご検討くださいませ。
実質新品として取り扱われたものを仕入直後より未読のままビニール封入しております。ただし、一度棚に並んだり再配本された商品ですので本出品としてはコンディション「非常に良い」とします、陳列や配送などでのスレなどの瑕疵についてはご容赦下さい。相場状況などに合わせて(定価に近い参考価格4830円)より高価格な設定となっております。よくご検討の上ご購入ください。在庫共有しておりますので品切れもございます。その場合、注文キャンセルとさせていただきますがご了承ください。在庫切れ、高価格設定の点についてお気にされない方のみご注文お願い致します。

 

これを利用して、商品の検索に細かくフィルタをかけることができそうです。
 

以上です。
 

[AWS] Amazon Product APIで検索できる本のカテゴリ(BrowseNode)一覧

Amazon APIで検索できる本のカテゴリは、BrowseNode(ブラウズノード)という数字で区別されています。

以下のものが一番上の階層で、この下に細かくカテゴリが分かれています。

466284 -> 文学・評論
571582 -> 人文・思想
571584 -> 社会・政治
492152 -> ノンフィクション
466286 -> 歴史・地理
466282 -> ビジネス・経済
492054 -> 投資・金融・会社経営
466290 -> 科学・テクノロジー
492166 -> 医学・薬学
466298 -> コンピュータ・IT
466294 -> アート・建築・デザイン
466292 -> 実用・スポーツ・ホビー
492228 -> 資格・検定
466304 -> 暮らし・健康・子育て
492090 -> 旅行ガイド
466302 -> 語学・辞事典・年鑑
3148931 -> 教育・学参・受験
466306 -> こども
466280 -> 漫画・アニメ・BL
500592 -> タレント写真集
492266 -> ゲーム攻略本
466296 -> エンターテイメント
466300 -> 新書・文庫
13384021 -> 雑誌
746102 -> 楽譜・スコア・音楽書
255460011 -> 古書
886928 -> カレンダー
13383771 -> ポスター
10667101 -> アダルト

【参考】

BrowseNode一覧取得ツール | みつりん

BrowseNode= 一覧トップ

詳細なカテゴリーの指定(BrowseNode) – 商品検索(ItemSearch) – Amazon Web サービス

Amazon Product Advertising APIの仕様変更(2011年10月26日)

AmazonのProduct Advertising APIの機能が、2011年10月26日に一部変更されるそうです。

・全てのAPIへのリクエストにおいて、AssociateTagが必須パラメータとなり、リクエスト処理時の確認対象となります。

・SellerLookup, SellerListingLookup および SellerListingSearch オペレーションはAPIでのサポートを終了いたします。

・ItemSearch リクエストの結果として返されるItemPage パラメータは、最大10ページまでに制限されます。

・MerchantId パラメータは、オファー、バリエーションおよび検索結果の絞り込み要素としてのサポートを終了いたします。

・Offers および ItemAttributes レスポンスグループにおいて返されるデータは、最も頻繁に使用される属性に制限されます。

詳しくは以下のページに書かれています。

Product Advertising API

仕様変更が多くて開発者泣かせで有名なAmazon APIですが、個人的にはMerchantIdが使えなくなるのが辛いです。

[Python] Amazon Product Advertising APIを使ってみました

Amazon Product Advertising API をPythonで使ってみました。

アマゾンのAPIを使うにはAWSへの登録が必要です。登録は下記を参考にして下さい。

【API】Amazon web service(AWS)への登録方法 – バコラー日記

下記のサイトにAmazonのAPIをPythonで使うためのコードが公開されています。認証用のシグネチャの作り方も載せてあるので非常に参考になります。

・引用元:PythonでAmazon Product Advertising APIを使う – 人工知能に関する断想録

amazon.py(引用元サイトのコードそのまま)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#coding:utf-8
import urllib2
import hashlib, hmac
import base64
import time
 
"""
Amazon Product Advertising APIを使って商品情報を取得する
"""
 
class Amazon:
    def __init__(self, access_key, secret_access_key, associate_tag=None):
        """コンストラクタ"""
        self.amazonurl = "http://webservices.amazon.co.jp/onca/xml"
        self.proxy_host = None
        self.proxy_port = None
        self.access_key = access_key
        self.secret_access_key = secret_access_key
        self.associate_tag = associate_tag
        self.version = "2009-10-01"
        self.url = None
 
    def setProxy(self, host, port=8080):
        """プロキシをセット"""
        self.proxy_host = host
        self.proxy_port = port
 
    def setVersion(self, version):
        """バージョンをセット"""
        self.version = version
 
    def itemLookup(self, item_id, **options):
        """アイテムの詳細情報を取得"""
        params = options
        params["Operation"] = "ItemLookup"
        params["ItemId"] = item_id
        return self.sendRequest(params)
 
    def itemSearch(self, search_index, **options):
        """アイテムを検索"""
        params = options
        params["Operation"] = "ItemSearch"
        params["SearchIndex"] = search_index
        return self.sendRequest(params)
 
    def buildURL(self, params):
        """RESTリクエストのURLアドレスを構築"""
        params["Service"] = "AWSECommerceService"
        params["AWSAccessKeyId"] = self.access_key
        if self.associate_tag is not None:
            params["AssociateTag"] = self.associate_tag
        params["Timestamp"] = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())
        sorted_params = sorted(params.items())
 
        # paramsのハッシュを展開
        request = []
        for p in sorted_params:
            pair = "%s=%s" % (p[0], urllib2.quote(p[1].encode("utf-8")))
            request.append(pair)
 
        # 2009/8/15から認証が導入されている
        # Secret Access Keyを使ってHMAC-SHA256を計算
        msg = "GET\nwebservices.amazon.co.jp\n/onca/xml\n%s" % ("&".join(request))
        hmac_digest = hmac.new(self.secret_access_key, msg, hashlib.sha256).digest()
        base64_encoded = base64.b64encode(hmac_digest)
        signature = urllib2.quote(base64_encoded)
 
        # Signatureをリクエストに追加してURLを作成
        request.append("Signature=%s" % signature)
        url = self.amazonurl + "?" + "&".join(request)
 
        return url
 
    def sendRequest(self, params):
        """Amazonにリクエストを送付し、取得したXMLを返す"""
        self.url = self.buildURL(params)
        if self.proxy_host:
            proxy_handler = urllib2.ProxyHandler({"http":"http://%s:%s/" % (self.proxy_host, self.proxy_port)})
            opener = urllib2.build_opener(proxy_handler)
        else:
            opener = urllib2.build_opener()
        return opener.open(self.url).read()

キーワードで本を検索してみました。

引用元サイトに掲載されているコードを元に、Pythonのプログラムを対話モードで実行できるように文字コード問題を解決したコードが下記になります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#coding:utf-8
import sys, codecs
sys.stdout = codecs.lookup('utf_8')[-1](sys.stdout)
 
from amazon import Amazon
 
# キーワードで本を検索したい!
amazon = Amazon("自分のAccess Key", "自分のSecret Access Key")
xml = amazon.itemSearch("Books", Keywords=u"ウェブサービス", ItemPage="1")  # 本
print amazon.url  # リクエストURL
#print unicode(xml, 'utf_8')	# Amazonのレスポンス
 
# XMLから情報を取り出す
from BeautifulSoup import BeautifulStoneSoup
soup = BeautifulStoneSoup(xml)
 
items = soup.find("items")
print u"%s件見つかりました" % soup.find("totalresults").contents[0]
total_pages = soup.find("totalpages").contents[0]
cur_page = soup.find("itempage").contents[0]
print u"ページ数: %s/%s" % (cur_page, total_pages)
 
for item in soup.findAll("item"):
    print item.asin.contents[0], item.author.contents[0], item.title.contents[0]

出力結果は下記のようになりました。

http://webservices.amazon.co.jp/onca/xml?AWSAccessKeyId=AKIAIB4QANRP3BXICEHQ&ItemPage=1&Keywords=%E3%82%A6%E3%82%A7%E3%83%96%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9&Operation=ItemSearch&SearchIndex=Books&Service=AWSECommerceService&Timestamp=2011-03-07T07%3A34%3A13Z&Signature=g5GSp7pBEGEUgundHtiqMHhwhOVjIda/5a1wCGPIkFw%3D
 
167件見つかりました
ページ数: 1/17
 
4820742019 岩本 のぞみ 事例でわかるWebサービス・ビジネス―XML、Webサービスのしくみ、基本技術、ビジネスへの適用例が図解でわかる!
4797336838 秋元 裕樹 PHP×WebサービスAPIコネクションズ
4434073435 Sanjiva Weerawarana Webサービスプラットフォームアーキテクチャ
4873110890 イーサン セラミ Webサービスエッセンシャルズ
4891003049 Scott Short XML Webサービス構築ガイド (マイクロソフト公式解説書)
488373174X 成田 雅彦 Webサービス・アプリケーション開発技法―SOAP/WSDL/ebXML
4822281167 嶋本 正 Webサービス完全構築ガイド - XML、SOAP、UDDI、WSDLによる先進Webシステムの設計・実装
4798007064 本 俊也 図解標準 最新Webサービス マスタリングハンドブック―XML、SOAP、WSDL、UDDIの基本から開発まで
4797320680 スティーブ グレアム JavaによるWebサービス構築
4861671000 佐久嶋 ひろみ PHP5 &amp; XMLによるWebサービス構築

以上です。

【参考】

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

Amazon.co.jp: Amazon Web サービス