基本形~GET
Python3で指定したURLのサイトからレスポンスを得る手順は以下のとおり。
urllib.request.urlopen
で接続のオブジェクトを得る- 接続オブジェクトに対して
read
メソッドを実行する
ただし結果はバイト列で得られる。
urlopenの引数にURLを指定
以下はurlopen
の引数にURLを指定した手順。
urlopen
の戻り値(Response
オブジェクト)を変数response
に保存response
のread
メソッドメソッドでレスポンスの内容を取得
レスポンスの内容はバイト列で返される。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import urllib.request # URLのセット url = 'http://www.httpbin.org' # 指定したURLで接続 with urllib.request.urlopen(url) as response: # レスポンスを取得 html = response.read() # レスポンスの内容を表示 print(html) # b'<!DOCTYPE html>\n<html lang="en">\n\n<head>\n <meta charset="UTF-8">\n .... |
文字列でレスポンスを得るには、decode
メソッドでバイト列を文字列にデコードする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import urllib.request url = 'http://www.httpbin.org' with urllib.request.urlopen(url) as response: html = response.read().decode('utf-8') print(html) # <!DOCTYPE html> # <html lang="en"> # # <head> # <meta charset="UTF-8"> # <title>httpbin.org</title> # .... |
urlopenの引数にRequestオブジェクトを指定
まずURLを指定してurllib.request.Request
オブジェクトを生成し、これをurlopen
の引数として接続を開く。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import urllib.request # URLをセット url = 'http://www.httpbin.org' # URLを指定してRequestオブジェクトを生成 request = urllib.request.Request(url) # Requestオブジェクトを指定して接続 with urllib.request.urlopen(request) as response: # レスポンスの内容を取得し、UTF-8でデコード html = response.read().decode('utf-8') # レスポンスの内容を表示 print(html) # <!DOCTYPE html> # <html lang="en"> # # <head> # <meta charset="UTF-8"> # <title>httpbin.org</title> # .... |
POST
ポストの流れは以下のとおり。
urllib.request
とurllib.parse
をインポートするurlopen
の引数にRequest
オブジェクトを渡すRequest
オブジェクト生成時にdata
引数を指定するとPOST
メソッドになる(method='POST'
がなくてもよい)- dataへ渡す引数は、以下のように処理
- 元のパラメータ群を辞書で準備
- そのデータをurllib.parse.urlencodeでエンコード(utf-8のエンコードも加える)
以下はhttpbin.org
を利用して確認した例。httpbin.org/post
からのレスポンスがJSON形式なので、json
ライブラリーをインポートしてレスポンスを整形している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
import json import urllib.parse import urllib.request # URLを設定 url = 'http://www.httpbin.org/post' # POSTで送るパラメーターを設定 parameters = { 'name': 'tau', 'site': 'taustation.com', } # 辞書で設定したパラメーターをパース・エンコード parsed_data = urllib.parse.urlencode(parameters).encode('utf-8') # data引数にパラメーターを指定してRequestオブジェクトを生成 request = urllib.request.Request(url, data=parsed_data) # Requestオブジェクトをurlopenに渡して接続 with urllib.request.urlopen(request) as response: # レスポンスをUTF-8でデコードして取得 jsontext = response.read().decode('utf-8') # httpbin.org/postのレスポンスはJSONなので整形して表示 decoded = json.loads(jsontext) encoded = json.dumps(decoded, ensure_ascii=False, indent=4) print(encoded) # { # "args": {}, # "data": "", # "files": {}, # "form": { # "name": "tau", # "site": "taustation.com" # }, # "headers": { # "Accept-Encoding": "identity", # "Content-Length": "28", # "Content-Type": "application/x-www-form-urlencoded", # "Host": "www.httpbin.org", # "User-Agent": "Python-urllib/3.6", # "X-Amzn-Trace-Id": "Root=1-62b8487d-6f1d1dee5fe6eb1e2e371679" # }, # "json": null, # "origin": "106.155.2.90", # "url": "http://www.httpbin.org/post" # } |