[Python]requestsモジュールの使い方

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)

参考

Python, Requestsの使い方

Python, RequestsでWeb APIを呼び出し(データ取得・操作)

Requests: 人間のためのHTTP

Requests: HTTP for Humans

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

16 + 5 =

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください