pythonを使用してAPIを叩くことが多くなりいつも使用しているライブラリの機能を整理してみた。
使用しているrequestsモジュールのバージョンは2.22.0
。
基本的な書き方
GETメソッドを使用したアクセスを実行する。
import requests
url = 'http://example.com'
response = requests.get(url)
print(response)
# <Response [200]>
requests.get()
を実行するとResponseオブジェクトが返る。このオブジェクトのメソッドを実行することでステータスコードやサーバから返される結果を取得することになる。
パラメータを指定する
Responseオブジェクトの使い方は後述するとして、次にGETでパラメータを指定してアクセスするには下記のように指定。
パラメータ部分は辞書形式でデータを作成し、引数param
に指定をする。
import requests
url = 'https://www.google.co.jp/search'
params = {'q': '日本', 'tbm': 'nws'}
response = requests.get(url, params=params)
print(response.url)
# https://www.google.co.jp/search?q=%E6%97%A5%E6%9C%AC&tbm=nws
POST
POSTメソッドを使用したアクセスも実行してみる。
POSTで送信する対象のデータはdata
属性で指定。こちらも辞書の形式で指定することになる。
response = requests.post(url, data={'key': 'value'})
リクエストヘッダを指定
POST送信する際に通常のエンコードされた状態(application/x-www-form-urlencoded
)ではなく、例えばJSONなど別の形式でデータ送信したい場合がある。
そうした時はヘッダ情報を自ら定義して引数のdata
にはその形式にあったデータを指定する必要がある。
jsonを送信する場合は下記のようになる。
import requests
import json
url = 'https://example.com'
payload = {'key': 'value'}
headers = {'content-type': 'application/json'}
response = requests.post(url, data=json.dumps(payload), headers=headers)
なおrequestsモジュールのversion2.4.2から、json形式でデータを送信する際にjsonモジュールを使用せずに送信することも可能。postメソッドの引数data
の代わりに引数json
にデータを割り当てるとヘッダー情報もapplication/json
の状態でデータを送信してくれる。
import requests
url = 'https://example.com'
payload = {'key': 'value'}
response = requests.post(url, json=payload)
レスポンス
レスポンスオブジェクトには様々な属性が付与されており、それぞれの属性にて各種のデータを参照することができる。
url属性
アクセスしたURLを取得。
url = 'https://www.google.co.jp/search'
params = {'q': '日本', 'tbm': 'nws'}
response = requests.get(url, params=params)
print(response.url)
# https://www.google.co.jp/search?q=%E6%97%A5%E6%9C%AC&tbm=nws
status_code属性
アクセスした際のステータスコードを取得。
response = requests.get(url)
print(requests.status_code)
# 200
headers属性
アクセスした際のレスポンスヘッダを辞書型のデータとして取得。
response = requests.get(url)
print(requests.headers)
# {'Date': 'Tue, 10 Dec 2019 01:25:58 GMT', 'Expires': '-1', 'Cache-Control': 'private, max-age=0', 'Content-Type': 'text/html; charset=ISO-8859-1', ...}
encoding属性
Requestsオブジェクトが推測した応答のエンコードを取得
response = requests.get(url)
print(requests.encoding)
# ISO-8859-1
text属性
encoding属性で取得できるエンコーディングでデコードされた、レスポンスの内容(文字列)を取得。
文字化けする場合はtext属性を呼び出す前にエンコーディングを変更することが可能。
response = requests.get(url)
response.encoding = 'utf-8'
print(response.text)
その他response.apparent_encoding
で文字コードを推定してくれる機能もある。(Pythonのrequestsモジュールでの文字コード対策)
content属性
デコードされていないレスポンスの内容を取得。バイト文字列として結果が返る。
response = requests.get(url)
print(response.content)