amazon mws でASINをJANに変換する [python]
転売の商品リサーチの都合で、
数千個のASINをJANに変換することが必要になった
かなり以前に amazon Product Advertising API を使って
ASINからJANを取得する python スクリプトを書いたのだが、
最近はMWSの方が主流のようで、私が契約している
アマゾン関係のツールなどでもMWSを利用しているものが多い
まぁ、モノレートからデータを引っ張ってきても良いのだが
あまり頻繁にアクセスするとブロックされるし、
同様のツールである せどりRankはデータのないものが
大量にあって、全然使い物にならない
MWSについては、以前から興味はあったのだが、
利用することもなかったので、
これを機会にMWS+pythonでデータを取得できるように
ネットで情報を探してみた
まず、結論を先に書くと、MWSはJANコードの取得に
向いていないということがわかった
あるいは、私が問合せ先を間違えているだけかもしれないが、
MWSの商品関連のオプションはあまり多くないし
GetMatchingProduct で問合せて
戻り値の中の itemattributes の partnumber ぐらいしかないと思うのだが、
JANコード(EAN)が入っていないものが多く、まるで使えないのである
では、アマゾンにそれらの商品のASIN-JANのペアにデータがないかというと
amazon Product Advertising API を使って問合せると全部でてくる
まぁ、出品関係など、amazon Product Advertising API では
できないことがMWSではできるので、
MWSは amazon Product Advertising API の上位版という訳ではなく
それぞれの機能を使い分けるようになっているのかもしれない
と、いうことで表題の機能はないのだが、自分のメモとして
苦労した部分を少し書いておく
まず、pythonということで、ネットを検索するとbotoというライブラリがヒットしたが、
これはアマゾンのストレージなども含む総合ザービスに対応したライブラリでるため
規模が大きすぎて、マニュアルの途中で挫折した
次に、amazon-mws-python
https://bitbucket.org/richardpenman/amazon-mws-python/src
をインストールして試したが、認証がうまくいかない
そもそもドメインには日本のドメインを指定するはずなのだが、
このライブラリにはドメインを指定する部分がない
もしかして、mws.amazonservices.comに行っているから
認証が通らないのではないだろうか?
そうだとすると、ライブラリを使わずにsignatureも
自分で生成するようなスクリプトを書く必要が有ると思って
ネットを探したら見つかった
http://stackoverflow.com/questions/25553874/amazon-api-mws-signaturedoesnotmatch
正確には、自分で全部やろうとして、うまくいっていない人の質問なのだが、
このソースと下の回答を合わせて、少し変更しただけで認証が通った
最終的に書いたスクリプトはこのようなものである
ファイルからASINのリストを読み込んで処理するようになっており
一分間に10回、一回の問合せで10個処理できるので
一分間に100個のASINが処理できる
これで、データがちゃんと取得できたら良かったのだが、
まぁ、ここまでできたら、後は出品関係とか
別のことにも応用できるだろうから、また、何かの役に立つこともあるだろう
スポンサードリンク
数千個のASINをJANに変換することが必要になった
かなり以前に amazon Product Advertising API を使って
ASINからJANを取得する python スクリプトを書いたのだが、
最近はMWSの方が主流のようで、私が契約している
アマゾン関係のツールなどでもMWSを利用しているものが多い
まぁ、モノレートからデータを引っ張ってきても良いのだが
あまり頻繁にアクセスするとブロックされるし、
同様のツールである せどりRankはデータのないものが
大量にあって、全然使い物にならない
MWSについては、以前から興味はあったのだが、
利用することもなかったので、
これを機会にMWS+pythonでデータを取得できるように
ネットで情報を探してみた
まず、結論を先に書くと、MWSはJANコードの取得に
向いていないということがわかった
あるいは、私が問合せ先を間違えているだけかもしれないが、
MWSの商品関連のオプションはあまり多くないし
GetMatchingProduct で問合せて
戻り値の中の itemattributes の partnumber ぐらいしかないと思うのだが、
JANコード(EAN)が入っていないものが多く、まるで使えないのである
では、アマゾンにそれらの商品のASIN-JANのペアにデータがないかというと
amazon Product Advertising API を使って問合せると全部でてくる
まぁ、出品関係など、amazon Product Advertising API では
できないことがMWSではできるので、
MWSは amazon Product Advertising API の上位版という訳ではなく
それぞれの機能を使い分けるようになっているのかもしれない
と、いうことで表題の機能はないのだが、自分のメモとして
苦労した部分を少し書いておく
まず、pythonということで、ネットを検索するとbotoというライブラリがヒットしたが、
これはアマゾンのストレージなども含む総合ザービスに対応したライブラリでるため
規模が大きすぎて、マニュアルの途中で挫折した
次に、amazon-mws-python
https://bitbucket.org/richardpenman/amazon-mws-python/src
をインストールして試したが、認証がうまくいかない
そもそもドメインには日本のドメインを指定するはずなのだが、
このライブラリにはドメインを指定する部分がない
もしかして、mws.amazonservices.comに行っているから
認証が通らないのではないだろうか?
そうだとすると、ライブラリを使わずにsignatureも
自分で生成するようなスクリプトを書く必要が有ると思って
ネットを探したら見つかった
http://stackoverflow.com/questions/25553874/amazon-api-mws-signaturedoesnotmatch
正確には、自分で全部やろうとして、うまくいっていない人の質問なのだが、
このソースと下の回答を合わせて、少し変更しただけで認証が通った
最終的に書いたスクリプトはこのようなものである
ファイルからASINのリストを読み込んで処理するようになっており
一分間に10回、一回の問合せで10個処理できるので
一分間に100個のASINが処理できる
これで、データがちゃんと取得できたら良かったのだが、
まぁ、ここまでできたら、後は出品関係とか
別のことにも応用できるだろうから、また、何かの役に立つこともあるだろう
asin2jan.py
# -*- coding: utf_8 -*-
import sys, os, base64, datetime, hashlib, hmac, urllib,time
from lxml import etree
from time import gmtime, strftime
from requests import request
import xml.etree.ElementTree as ET
def get_timestamp():
"""Return correctly formatted timestamp"""
return strftime("%Y-%m-%dT%H:%M:%SZ", gmtime())
def calc_signature(method, domain, URI, request_description, key):
"""Calculate signature to send with request"""
sig_data = method + '\n' + \
domain.lower() + '\n' + \
URI + '\n' + \
request_description
hmac_obj = hmac.new(key, sig_data, hashlib.sha256)
digest = hmac_obj.digest()
return urllib.quote(base64.b64encode(digest), safe='-_+=/.~')
SECRET_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
AWS_ACCESS_KEY = 'xxxxxxxxxxxxxx'
SELLER_ID = 'xxxxxxxxxx'
MARKETPLACE_ID = 'A1VC38T7YXB528'
Action = 'GetMatchingProduct'
URI = '/Products/2011-10-01'
domain = 'mws.amazonservices.jp'
SignatureMethod = 'HmacSHA256'
SignatureVersion = '2'
Version = '2011-10-01'
proto = 'https://'
method = 'POST'
f1 = open("asin_list.txt")
lines = f1.readlines()
f1.close()
asin_list = []
for item in lines:
if item != "":
asin_list.append(item.decode('utf-8').strip())
while len(asin_list) > 0:
Timestamp = get_timestamp()
payload = {
'AWSAccessKeyId': AWS_ACCESS_KEY,
'Action': Action,
'SellerId': SELLER_ID,
'SignatureVersion': SignatureVersion,
'Timestamp': Timestamp,
'Version': Version,
'SignatureMethod': SignatureMethod,
'MarketplaceId': MARKETPLACE_ID
}
if len(asin_list) > 10:
limit = 10
else:
limit = len(asin_list)
for i in range(limit):
index = "ASINList.ASIN."+str(i+1)
payload[index] = asin_list.pop(0)
request_description = '&'.join(['%s=%s' % (k, urllib.quote(payload[k], safe='-_.~').encode('utf-8')) for k in sorted(payload)])
sig = calc_signature(method, domain, URI, request_description, SECRET_KEY)
url = '%s%s?%s&Signature=%s' % \
(proto+domain, URI, request_description, urllib.quote(sig))
headers = {
'Host': domain,
'Content-Type': 'text/xml',
'x-amazon-user-agent': 'python-requests/1.2.0 (Language=Python)'
}
response = request(method, url, headers=headers)
root = etree.fromstring(response.content, etree.HTMLParser())
items = root.xpath('//product')
for item in items:
item_asin = item.find('identifiers/marketplaceasin/asin').text
title = item.find('attributesets/itemattributes/title').text
jan = item.find('attributesets/itemattributes/partnumber')
if jan != None:
jan = jan.text
else:
jan = ""
print item_asin+"|"+jan+"|"+title
time.sleep(6)
スポンサードリンク
タグ:Python
2015-06-08 06:50
nice!(0)
コメント(1)
トラックバック(0)
Vigra On Line Synthroid 75 Mcg No Prescription <a href=http://cialviag.com>п»їcialis</a> Keflex 700 Mg Buy Online Viagra Pfizer From Pakistan
by Ellzema (2019-05-04 12:37)