Python_urllibでHTTPリクエスト

Python_urllibでHTTPリクエスト

Python から HTTP API を利用する場合にはrequests モジュールが便利ですが、

urllib.request で単純にリクエストを送信することができます。

組み込み環境が古いPythonしか動作しない場合に便利です。


プロキシ設定

プロキシを設定する場合、urllib.request.install_opener()を実行します。


import urllib.request

def set_proxy(proxy_addr):
    proxy_info = {
        'http': 'http://' + proxy_addr,
        'https': 'http://' + proxy_addr
    }

    # urllibに設定を反映する。
    proxy_support = urllib.request.ProxyHandler(proxy_info)
    opener = urllib.request.build_opener(proxy_support)
    urllib.request.install_opener(opener)

GETリクエストを発行する。

GETの場合は、Request オブジェクトを作成しurlopen に渡します。



import urllib.request

req = urllib.request.Request(url)
with urllib.request.urlopen(req) as res:
    body = res.read()

QueryString

urllib.parse.urlencode を使って URL を組み立てることでQueryString リクエストパラメータを送ることができます。


params = {
    'key': 'value',
}

req = urllib.request.Request('{}?{}'.format(url, urllib.parse.urlencode(params)))
with urllib.request.urlopen(req) as res:
    body = res.read()

POSTリクエストを発行する。

Request オブジェクト作成時に data パラメータを指定すると POST メソッドのリクエストを作成できます。

下記はログイン処理の例で、urlとリクエストヘッダとリクエストボディを渡します。

リクエストボディは「json.dumps(data).encode('utf8'),」JSONを文字列化して渡します。


import urllib
import json

def login(self, url, username, password):
    headers = {
        'content-type': 'application/json'
    }
    data = {
        "username": username,
        "password": password
    }

    login_info = post(url, headers, data)
    if login_info is None:
        return False
    return True

def post(self, endpoint, headers, data=None):
    """
    HTTP POSTを実行する。

    Parameters
    ----------
    endpoint : str
        POST先のURLを指定します。
    headers : obj
        POSTのヘッダ情報
    data : obj
        POSTのbodyデータ情報

    Returns
    -------
    obj:
        HTTPレスポンス(JSON形式)を返す。
        エラー時にはNoneを返す。
    """
    try:
        if data is None:
            request = urllib.request.Request(
                endpoint,
                headers=headers,
                method="POST"
            )
        else:
            request = urllib.request.Request(
                endpoint,
                data=json.dumps(data).encode('utf8'),
                headers=headers,
                method="POST"
            )
        with urllib.request.urlopen(request) as response:
            res_body = json.loads(response.read().decode('utf8'))
        return res_body
    except urllib.error.HTTPError as e:
        # HTTP ステータスコードが 4xx または 5xx だったとき
        print(e)
        return None
    except Exception as e:
        # HTTP 通信に失敗したとき
        print(e)
        return None

関連ページ