Main Contents
2006年10月01日
kakaku.com Web API for Python
価格.comがAPIを公開したので、Pythonバインディング: KakakuComAPIクラスを作ってみました。python 2.4以上が必要。
中身は以下のような感じ。なんか、妙に長い。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使用版)- by
- at 2006年10月01日 14:30
- in Python
TrackBacks
トラックバックURL:
Post a comment