Pythonの基礎 WebAPIを使ってみる YahooAPI(ショッピング、カテゴリランキング編)その3 JSONの解析
YahooAPIを使ってみる その3
さて、二つの関数を見ていきます。 前回は
def yapi_topics():
をとりあげましたので、今回は
def do_json(s):
の方を見ていきましょう。
YahooAPIで貰ってきた情報をJSON形式で読み込み、表示できるように加工する
やっていることはシンプルです。しかし、JSONに慣れていないと、どう熱かっていいか分からないですね 分からないなりに、丁寧に確認していきます。
メインにあたる部分
if __name__ == '__main__': json_str = yapi_topics() #前回確認しました do_json(json_str) #今回はここ!!!
前回はYahooAPIに対してurllib.urlopen()で情報をもらうところまでやりました。 urllib.urlopen()は、ファイルを開くようにWeb上のデータを取得できるので、戻り値をread()して、戻り値としてjson_strを得ることができました。
今回は、そのjson_strを引数としてdo_json()に渡します。
では以下を見ていきましょう。
do_json(s)関数
def do_json(s): data = json.loads(s) #下の二行のコメントを外すと、yahooから得たJSON全部を表示して終了する。これで一度確認しみるとよい #print(json.dumps(data, sort_keys=True, indent=4)) #sys.exit() #jsonの階層の"Result"以下を辞書にする。keyは番号:その次の配列がvalueになっている item_list = data["ResultSet"]["0"]["Result"] print(json.dumps(item_list, sort_keys=True, indent=4)) #keyは番号その他になる。番号ならソートしやすいし、その他なら例外の処理をいれればよい print item_list.keys() #空のディクショナリを作る ranking = {} for k, v in item_list.iteritems(): try: rank = int(v["_attributes"]["rank"]) vector = v["_attributes"]["vector"] name = v["Name"] ranking[rank] = [vector, name] except: if k == "RankingInfo": StartDate = v["StartDate"] EndDate = v["EndDate"] print '-' * 40 print u"集計開始日:", StartDate print u"集計終了日:", EndDate print '-' * 40 ranking_keys = list(ranking.keys()) ranking_keys.sort() for i in ranking_keys: print i, ranking[i][0], ranking [i][1]
コード自体は短いのですが、何やら分からないことが多そうですね。
いや、よく見るとこれまでやってきたことと同じようにも見えますね!
では今回も少しずつ見ていきましょう(すみません、スピード感にかけますね、このブログは。。。。)
上記ではコメントになっている部分ですが、コメントを外してみます。
先にsys.exit()を説明しておきましょ
Python を終了します。 exit() は SystemExit を送出するので、 try ステートメントの finally 節に終了処理を記述したり、上位レベルで例外を捕捉して exit 処理を中断したりすることができます。
要するに、中断ですね。 今回は、試しにJSONを表示させたら終わり、っていう趣旨で使います。 通常はエラー処理などで使うようですね。
json.dumps()については以前学んだので、それを参照しましょう。
def do_json(s): data = json.loads(s) #下の二行のコメントを外すと、yahooから得たJSON全部を表示して終了する。これで一度確認しみるとよい print(json.dumps(data, sort_keys=True, indent=4)) sys.exit()
で、こうなります。
#実行結果 { "ResultSet": { "0": { "Result": { "0": { "Code": "soukai_9000009984050", "Image": { "Id": "soukai_9000009984050", "Medium": "http://item.shopping.c.yimg.jp/i/g/soukai_9000009984050", "Small": "http://item.shopping.c.yimg.jp/i/c/soukai_9000009984050" }, "Name": "\u30bf\u30a4\u30e0\u30bb\u30fc\u30eb\u4e2d\u3000\u30af\u30ea\u30b9\u30bf\u30eb\u30ac\u30a4\u30b6\u30fc(500mL*48\u672c\u5165) (\u6c34\u30df\u30cd\u30e9\u30eb\u30a6\u30a9\u30fc\u30bf\u30fc)", "Review": { "Count": "45", "Rate": "4.78", "Url": "http://shopping.yahoo.co.jp/review/item/list?store_id=soukai&page_key=9000009984050" }, "Store": { "Id": "soukai", "Name": "\u723d\u5feb\u30c9\u30e9\u30c3\u30b0", "Url": "http://store.shopping.yahoo.co.jp/soukai/index.html" }, "Url": "http://store.shopping.yahoo.co.jp/soukai/9000009984050.html", "_attributes": { "rank": "1", "type": "item", "vector": "new" } }, "1": { "Code": "adachinet-umai_yh-g30", "Image": { "Id": "adachinet-umai_yh-g30", "Medium": "http://item.shopping.c.yimg.jp/i/g/adachinet-umai_yh-g30", "Small": "http://item.shopping.c.yimg.jp/i/c/adachinet-umai_yh-g30" }, "Name": "\u5c71\u5f62\u770c \u65b0\u7c73 1\u7b49\u7c73 \u306f\u3048\u306c\u304d \u767d\u7c73\u7d0427kg\u304b\u7384\u7c7330kg \u5e73\u621025\u5e74\u5ea6", "Review": { "Count": "1", "Rate": "5.00", "Url": "http://shopping.yahoo.co.jp/review/item/list?store_id=adachinet-umai&page_key=yh-g30" }, "Store": { "Id": "adachinet-umai", "Name": "\u3042\u3060\u3061\u306d\u3063\u3068\u7f8e\u7c73\u5c4b", "Url": "http://store.shopping.yahoo.co.jp/adachinet-umai/index.html" }, "Url": "http://store.shopping.yahoo.co.jp/adachinet-umai/yh-g30.html", "_attributes": { "rank": "2", "type": "item", "vector": "new" } }, "10": { 以下、つづく。。。。
def do_json(s): data = json.loads(s)
この関数の引数であるsは、YahooAPIからのレスポンスになります。レスポンスをread()したものが引数になっていますね。
data = json.
- 作者: Mark Lutz,夏目大
- 出版社/メーカー: オライリージャパン
- 発売日: 2009/02/26
- メディア: 大型本
- 購入: 12人 クリック: 423回
- この商品を含むブログ (125件) を見る
loads(s)で、そのレスポンスをJSONデータとしてdataに格納した訳ですね。
さて、あとはこれを解析して行くだけです。
簡単ですね!!