PythonでHTTP通信する方法のメモ。
(Python3系対象)
#HTTP通信ライブラリ
Dive Into Python 3ではPython標準の「urllib.request」を使う方法とサードパーティの「httplib2」を使う方法が紹介されており、httplib2が推奨されているが、自分はなるべく純正を使いたい派で、かつhttplib2でしか使えないような機能を必要としていないので、とりあえずurllib.requestを使って試してみる。
#urllib.requestでGET
urllib.requestモジュールのurlopen関数を使用。引数にURLを指定するだけ。リクエストパラメータはエンコードが必要なければURLの後ろに「?param1=value1¶m2=value2」のように書けばOK。
レスポンスはhttp.client.HTTPResponseオブジェクトが返ってくるので、read()関数でレスポンスボディを取得する。
試しに株式会社アイビスさんが提供している郵便番号検索APIを叩いてみる。
import urllib.request
with urllib.request.urlopen("http://zipcloud.ibsnet.co.jp/api/search?zipcode=4200855") as res:
html = res.read().decode("utf-8")
print(html)
リクエストパラメータのエンコーディング
リクエストパラメータに日本語などが含まれる場合はエンコーディングをする必要がある。「urllib.parse」モジュールのurlencode()関数で簡単にできそう。引数は辞書型で、複数項目が格納されている場合は自動的に&でつないだパラメータ文字列になる。(先頭の?は付かない)
前述の郵便番号検索のパラメータをこの方法で指定するように修正。(ASCIIだけなのでエンコードの必要はないのだけれど…)
import urllib.request
import urllib.parse
#リクエストパラメータをエンコード
params = {"zipcode":"4200855"}
encodedParams = urllib.parse.urlencode(params)
#エンコードしたリクエストパラメータを付加してAPIコール
with urllib.request.urlopen("http://zipcloud.ibsnet.co.jp/api/search?" + encodedParams) as res:
html = res.read().decode("utf-8")
print(html)