SSブログ

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が処理できる

これで、データがちゃんと取得できたら良かったのだが、
まぁ、ここまでできたら、後は出品関係とか
別のことにも応用できるだろうから、また、何かの役に立つこともあるだろう



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
nice!(0)  コメント(1)  トラックバック(0) 

nice! 0

コメント 1

Ellzema

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) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

トラックバックの受付は締め切りました

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。