いももちのきもち

新米プログラマによる技術的メモ

requestsモジュールを利用してjson形式でレスポンスを得る

toricor.hatenablog.com
上の記事の続きです。


WormBaseのRESTful APIを利用して、json形式のデータを得ます。
使用するモジュールはrequestsです。
今回はrequestsモジュールの他に組み込みのjsonモジュールについても簡単に述べます。
requests導入や利用法については、Qiitaのこの記事が大変参考になります。

それでは実際に使う場合の例を見てみます。
例:

import requests
import json

gene_id = "WBGene00015354" # gene: snet-1
url = "http://www.wormbase.org/rest/widget/gene/" + gene_id + "/expression/"

headers = {"content-type": "application/json"}
r = requests.get(url, headers=headers)
data = r.json()
print json.dumps(data, indent=4)

まずgene_idに調べたい遺伝子のIDを指定し、urlを生成します。
その後、

headers = {"content-type": "application/json"}
r = requests.get(url, headers=headers)

今回はjson形式のレスポンスが欲しいので、Content-Typeを明示します。requests.get()関数の第1引数にアクセスするページのURLを、第2引数にheaderキーワードを明示します。サーバーからデータが正しく返されれば、そのデータがrという変数名のrequestsのオブジェクトに格納されます。

data = r.json()

requests.json()でレスポンスをデコードします。この結果、requestsのオブジェクトはpythonのディクショナリに変換され、以降のデータの扱いが簡単になります。

(付録)レスポンスを見やすく表示する

レスポンスの例:

{"fields": {"anatomy_terms": {"data": {"WBbt:0003983": {"taxonomy": "all", "class": "anatomy_term", "id": "WBbt:0003983", ...

レスポンスが得られましたが、このままの形では人間が見たときによくわかりませんので、見やすい形に整形します。

print json.dumps(data, indent=4) # python 2系

jsonモジュールの機能を利用します。
json.dumps()は引数にディクショナリを受け取り、文字列に変換する関数です(エンコーディング)。このとき第2引数にindentキーワードを指定することでjson形式のデータを見やすく表示できます。

必要な情報を取り出す(parseする)

さてjson形式のデータはpythonでいう、ディクショナリ(とリスト)が入れ子になった構造をしています。必要な情報を取り出すためにディクショナリのキーを指定します。

例えば 
data["fields"]["name"]["data"]
を指定した場合、

print json.dumps(data["fields"]["name"]["data"], indent=4)
{
    "taxonomy": "c_elegans", 
    "class": "gene", 
    "id": "WBGene00015354", 
    "label": "snet-1"
}

ディクショナリが得られますので、たとえば遺伝子名を得たい場合はさらにlabelをキーに指定して、
data["fields"]["name"]["data"]["label"]
とします。