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
関連ページ
- Python
- Python_シェルコマンドを実行する
- Python_HTML解析
- Python_jsonファイルの扱い
- Python_urllibでHTTPリクエスト
- Python_マークルツリーを実装する