ゴミ箱の中のメモ帳

まだ見ぬ息子たちへ綴る手記

PythonからのAmazon Product Advertising APIのテスト

Amazonマーケットプレイスから中古価格の一覧を取得しようと思ったのだが出来ない様子。方法を知っている方は教えてください。

Amazon Product Advertising APIPythonから扱うにはbottlenoseとamazonproductと言うモジュールがあるみたいなのだが、どちらを利用してもOffersの値を取ることが出きなかった。両方を使った感想としては、amazonproductは手軽にAPIをラッピングしてくれるラッパ、bottlenoseはAPIコールのみを代替してくれるだけで、レスポンスの値は自前でパースしないといけなAPIモジュール的な感じ。

基本的な操作だけならamazonproductが便利で、パースはlxmlが使われているので非常に高速になる上に使いやすい。bottlenoseはAPIのラッパなのでパーサは自前で用意するのだが、もちろんlxmlでもBeautifuSoupでも好きなものを使えばいい。

初めてのPython 第3版

初めてのPython 第3版


そいで両方共を使ってAPIから中古価格を取得しようと思ったのだが、どちらもそのような方法が提供されていない。開発ガイドを見るとOffersの値が提供されていない様子。2010年ころには提供されていたようだが、私が読む中ではOffersを見つけることが出来なかった。

そんなこんなでAPIからはどうしてもマーケットプレイスの値が取得できないようなのでHTMLページから取得することにした。サンプルコードは一番下に貼り付けておく。

このサンプルコードはAPIを経由せずにWebページから直接取得しているので各自Amazonの規約を確認して実行すること。どんなことが起きても知りません。

#!/usr/bin/python
# coding: UTF-8

from bottlenose import api
import BeautifulSoup
import requests

cfg = {
    "access_key": "FOO",
    "secret_key": "BAR",
    "associate_tag": "BAZ-22",
    "locale": "JP",
}

amazon = api.Amazon( cfg["access_key"], cfg["secret_key"], cfg["associate_tag"], Region=cfg["locale"])

query = u"人はなぜ学ばなければならないのか"

def item_search( keywords, search_index="Books", item_page=1):
    response = amazon.ItemSearch( SearchIndex=search_index, Keywords=keywords, ItemPage=item_page, ResponseGroup="Large")
    soup = BeautifulSoup.BeautifulSoup( response)
    return soup.findAll( "item")

def offer_search( asin, item_count=5):
    response = requests.get( "http://www.amazon.co.jp/gp/offer-listing/%s/" % ( asin,))
    soup = BeautifulSoup.BeautifulSoup( response.text)
    items = []
    for item in soup.findAll( "div", { "class": "a-row a-spacing-mini olpOffer"}):
        price = item.find( "span", { "class": "a-size-large a-color-price olpOfferPrice a-text-bold"}).text
        condition = item.find( "h3", { "class": "a-spacing-small olpCondition"}).text
        comment = item.find( "div", { "class": "comments"})
        comment = comment.text if comment else ""

        items.append( {
            "price": price,
            "condition": condition,
            "comment": comment,
        })
    return items

for item in item_search( query):
    title = item.find( "title").text
    asin = item.find( "asin").text

    print title
    for item in offer_search( asin):
        print item["comment"]

初めてのPython 第3版

初めてのPython 第3版

パーフェクトPython (PERFECT SERIES 5)

パーフェクトPython (PERFECT SERIES 5)

エキスパートPythonプログラミング

エキスパートPythonプログラミング

Pythonプロフェッショナルプログラミング

Pythonプロフェッショナルプログラミング