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"]
とします。