Main Contents

2006年10月01日

kakaku.com Web API for Python

このエントリーをはてなブックマークする このエントリーを含むはてなブックマーク | Save This Page (del.icio.us)

価格.com WEBサービス API マニュアル

価格.comがAPIを公開したので、Pythonバインディング: KakakuComAPIクラスを作ってみました。python 2.4以上が必要。

KakakuComAPIクラスをダウンロードする

中身は以下のような感じ。なんか、妙に長い。XMLのパーズ部分をもっとすんなり書けると良いのだけど。

import urllib, types
from xml.dom import minidom

class KakakuComAPI(object):
    API_ENDPOINT = r'http://api.kakaku.com/Ver1/ItemSearch.asp'
    ELEMENTS = ['ProductID',
                'ProductName',
                'MakerName',
                'CategoryName',
                'PvRanking',
                'ImageUrl',
                'ItemPageUrl',
                'BbsPageUrl',
                'ReviewPageUrl',
                'LowestPrice',
                'NumOfBbs']

    @classmethod
    def search(cls, **args):
        params = cls.__parameterize(args)
        url = cls.API_ENDPOINT + '?' + params
        f = urllib.urlopen(url)
        xml = f.read()
        f.close()
        result = cls.__construct(xml)
        result['RequestedUrl'] = url
        return result

    @classmethod
    def __parameterize(cls, args):

        kw = args.get('Keyword')
        arg_enc = args.get('ArgsEncode')
        if type(kw) is types.UnicodeType:
            kw = kw.encode('shift_jis', 'ignore')
        elif arg_enc:
            kw = kw.decode(arg_enc, 'ignore').encode('shift_jis', 'ignore')

        params = []
        params.append("%s=%s" % ('Keyword', urllib.quote(kw)))

        for p in ('ResultSet', 'CategoryGroup', 'SortOrder', 'PageNum'):
            v = args.get(p)
            if v != None:
                params.append("%s=%s" % (p, urllib.quote(v)))

        return '&'.join(params)

    @classmethod
    def __construct(cls, xml):
        result = {}
        dom = minidom.parseString(xml)

        err = dom.getElementsByTagName('Error')
        if err and len(err) >= 1:
            msg = err[0].getElementsByTagName('Message')[0]
            result['Error'] = msg.firstChild.nodeValue

        nor = dom.getElementsByTagName('NumOfResult')
        if nor and len(nor) >=1:
            result['NumOfResult'] = nor[0].firstChild.nodeValue

        items = dom.getElementsByTagName('Item')
        if items:
            item_list = []
            for item in items:
                item_list.append(cls.__parse_item(item))
            result['Items'] = item_list

        return result

    @classmethod
    def __parse_item(cls, item):
        result = {}
        for e in cls.ELEMENTS:
            tags = item.getElementsByTagName(e)
            if tags:
                result[e] = tags[0].firstChild.nodeValue
            else:
                result[e] = ''
        return result

以下、使用例。

Keywordに日本語を含む場合はsjisで渡すか、unicodeで渡すか、そうでなければArgsEncodeで明示するかする必要があることに注意。

from kakaku_api import KakakuComAPI

r = KakakuComAPI.search(Keyword="vaio")
r = KakakuComAPI.search(Keyword=u"バイオ")
r = KakakuComAPI.search(Keyword=u"バイオ".encode("shift_jis"))
r = KakakuComAPI.search(Keyword=u"バイオ".encode("euc-jp"), ArgsEncode="euc-jp")
r = KakakuComAPI.search(Keyword="vaio",
                        ResultSet="medium",
                        SortOrder="pricerank",
                        PageNum="4",
                        CategoryGroup="Pc")

結果として受け取る r はこんなかんじ


{'Items': [{'BbsPageUrl': u'http://kakaku.com/bbs/Main.asp?PrdKey=01307211611',
    'CategoryName': u'\u30d1\u30bd\u30b3\u30f3\u5468\u8fba\u6a5f\u5668>MP3',
    'ImageUrl': u'http://img.kakaku.com/images/productimage/m/01307211611.jpg',
    'ItemPageUrl': u'http://kakaku.com/item/01307211611/',
    'LowestPrice': u'15298',
    'MakerName': u'SONY',
    'NumOfBbs': u'516',
    'ProductID': u'01307211611',
    'ProductName': u'NW-E005 \u30d0\u30a4\u30aa\u30ec\u30c3\u30c8 (2GB)',
    'PvRanking': u'4',
    'ReviewPageUrl': u'http://kakaku.com/prdevaluate/evaluate.asp?PrdKey=01307211611'},
  ... ],
 'NumOfResult': u'762',
 'RequestedUrl': 'http://api.kakaku.com/Ver1/ItemSearch.asp?Keyword=vaio&ResultSet=medium&CategoryGroup=Pc&SortOrder=pricerank&PageNum=4'}

または

{'Error': u'\nItemNotFound',
 'RequestedUrl': 'http://api.kakaku.com/Ver1/ItemSearch.asp?Keyword=vaio0000'}

追記

ElementTreeを使ったバージョンも書いてみました。see: kh.log - kakaku.com Web API for Python (ElementTree使用版)

TrackBacks

トラックバックURL:

Comments

Post a comment

コメントフォーム