Python3 – WebAPI

概要

PythonでWebAPIによってデータをリクエストして取得する方法をまとめる。ここでは郵便番号配信サービスのzipcloudのAPIを利用する。

流れは以下の通り。

  1. 準備
    1. urllib.requestライブラリーのインポート
    2. APIエンドポイントURLのセット
    3. パラメーターのセット
    4. パラメーターのエンコード
  2. リクエストとレスポンス
    1. Requestオブジェクトの生成
    2. リクエスト実行とResponseオブジェクトの取得
  3. レスポンスオブジェクトのデコード

API仕様

zipcloudサイトの郵便番号検索APIの内容をまとめると以下の通り。

  • リクエストURL:https://zipcloud.ibsnet.co.jp/api/search
  • リクエストパラメーター
    • zipcode~必須~郵便番号(ハイフンなし7桁の数字)
    • callback~オプション~JSONPとして出力する際のコールバック関数名
    • limit~オプション~同一の郵便番号で複数のデータが存在する場合に返される上限件数(デフォルト20)
    • urlパターンの例:https://zipcloud.ibsnet.co.jp/api/search?zipcode=1330051

コード

最初に実行コードの全体を示す。

コード説明

準備

urllib.requestライブラリーのインポート

HTTPリクエストに必要なurllib.requestライブラリーをインポートする。

APIエンドポイントURLのセット

ここではzipcloudのAPIエンドポイントのURLを変数urlにセットする。

リクエストパラメーターのセット

リクエストパラメーターを辞書でセット。ここでは仕様に従ってzipcode'1130051'を与えている。

パラメーターのエンコード

リクエストに備えて、パラメーター文字列をバイト列にエンコード。ここでは一般的なutf-8を指定しているが、郵便番号は半角数字なのでasciishift_jisでも同じ結果となる。その形式は

urllib.parse.urlencode(パラメーター辞書).encode('文字コード')

リクエストとレスポンス

Requestオブジェクトの生成

ベースのURLとエンコードされたパラメーターを与えてRequestオブジェクトを生成する。

urllib.request.Request(URL文字列, data=エンコード後のパラメーター)

リクエスト実行とResponseオブジェクト取得

リクエストはRequestオブジェクトを引数としてurlopenメソッドを実行。戻り値は結果のResponseオブジェクト。

Responseオブジェクトのデコード

取得したままのResponseオブジェクトをそのまま表示しても、クラスの文字列表現となるだけ。

そこで、文字コードを指定してデコードしてやる。ここではutf-8を指定している。

response.read().decode(文字コード)

結果は文字コードで指定されたエンコード方式でデコードされ、レスポンスの文字列が得られる。

zipcloudのレスポンスはJSON形式でインデント整形された文字列となるが、あくまで文字列であり、要素を指定した値の取出しはできない。

JSON文字列の取り扱い

準備

JSON形式の文字列を辞書として読み込んだり、整形表示をしてみる(PythonでのJSONの取り扱い)。

まず、JSONを扱うにはjsonライブラリーが必要。

辞書への展開

JSON形式の文字列をPythonの辞書として取り込む。

json.loads(JSON形式の文字列)

レスポンス内容の取出し

これはzipcloudの仕様になるが、レスポンスのJSONデータのレスポンス部分は入れ子の内側('response'キーに対応)にあるので、これを取り出す。

同じ郵便番号に複数の住所が存在する場合もあるが、ここでは最初の1つだけ取り出している。

JSON形式での整形出力

辞書の内容を再度整形して文字列化する。

json.dumps(辞書, indent=桁数)

ただし、このままではマルチバイト文字が16進にエスケープされてしまう。

エスケープの抑制

json.dumpsでエスケープを抑制することで、もとの文字コードに基づいて処理される。エスケープを抑制するためには引数でensure_ascii=Falseをセットする。