LoginSignup
17
24

More than 5 years have passed since last update.

PythonでHTTP通信

Posted at

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&param2=value2」のように書けばOK。

レスポンスはhttp.client.HTTPResponseオブジェクトが返ってくるので、read()関数でレスポンスボディを取得する。

試しに株式会社アイビスさんが提供している郵便番号検索APIを叩いてみる。

http_get.py
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だけなのでエンコードの必要はないのだけれど…)

http_get2.py
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)
17
24
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
24