4.1 応答の処理
requestsモジュールは、サーバーの応答を処理するための便利なメソッドを提供しているよ。
ステータスコード
サーバーの応答には、リクエスト処理のステータスも含まれているんだ。 ステータス情報は、status_codeとreasonフィールドに含まれているよ。以下の例を見てみよう:
import requests
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.status_code) # 応答のステータスコードを出す
print(response.reason) # ステータスの説明を出す
print(response.ok) # ステータスコードが400未満の場合にTrueを返す
ヘッダー
HTTPリクエストにヘッダーは付き物だよね?リクエストヘッダーや応答ヘッダーが欲しい時は、 headersフィールド経由でアクセスできるよ:
import requests
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.headers) # 応答のヘッダーを出す
print(response.headers['Content-Type']) # 特定のヘッダーの値を出す
応答のボディ
サーバーからの応答は、バイト列、テキスト、jsonまたはxmlが含まれることがあるよ。 何をリクエストしているかが分かっていれば、すぐに必要なタイプのオブジェクトを取得できる。 次のメソッド/フィールドのいずれかを使うんだ:
import requests
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.text) # テキストとして応答のボディを出す
print(response.json()) # JSONとして応答のボディを出す
print(response.content) # バイトとして応答のボディを出す
ヘッダー(headers)と応答ステータスの詳細については、ネットワークの構造に関する講義で学べるよ。
4.2 エラー処理
requestsモジュールは、エラーを処理するための例外も提供しているよ。
HTTP標準では例外を含まないんだ。代わりに、エラーコード(status_code)を使用する。 失敗したリクエストでPython例外を発生させたい場合は、raise_for_status()を明示的に呼び出す必要があるよ。
例:
import requests
try:
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
response.raise_for_status() # ステータスコード4xxおよび5xxで例外を発生させる
except requests.exceptions.HTTPError as err:
print(f"HTTPエラーが発生した: {err}")
except Exception as err:
print(f"その他のエラーが発生した: {err}")
else:
print("成功!")
エラーコードの詳細については、ネットワークの構造に関する講義で学べるよ。
4.3 データの送信
JSONが発明される前は、大量のデータは「フォーム」で送信されていたんだ。 フォームは、ブラウザページの特別なオブジェクト(およびHTTPのデータ標準)だよ。 データを「フォームで」送信したい場合は、リクエストと一緒にdataパラメーターを渡すだけでいい。
重要! GETリクエストはフォームをサポートしていないんだ。ボディがないからね。 そのため、データはURLに含まれるだけなんだ。
GETリクエストでのデータ送信
GETリクエストでは、データはURLパラメーターを通して送信される。例を見てみよう:
import requests
params = {'key1': 'value1', 'key2': 'value2'}
response = requests.get('https://httpbin.org/get', params=params)
print(response.url) # パラメーターが追加されたURLを出す
フォームデータの送信
データをサーバーに送信するために、POSTリクエストを使うよ。
例:
import requests
data = {
'username': 'example',
'password': 'password'
}
response = requests.post('https://httpbin.org/post', data=data)
print(response.json())
ファイルの送信
バイナリーデータをインターネットに送信したい場合、例えば画像をアップロードするときは、 リクエストでfilesパラメーターを使ってファイルを渡す必要があるんだ。
例:
import requests
files = {'file': open('example.txt', 'rb')}
response = requests.post('https://httpbin.org/post', files=files)
print(response.json())
すっごく簡単だよね。複数のファイルを送りたい場合は、files変数に名前付きで列挙するんだ。
重要!リソース漏れを避けるために、送信後はファイルを閉じるのを忘れないでね。 with構文を使うと、操作が完了した後に自動的にファイルを閉じてくれるのでベストだよ:
import requests
with open('example.txt', 'rb') as f:
files = {'file': f}
response = requests.post('https://httpbin.org/post', files=files)
print(response.json())
4.4 ログインと認証
API(Application Programming Interface)は、異なるプログラムが互いにやり取りできるようにするための規則やプロトコルのセットのことだよ。 多くのサイトやサービスは、ログイン後にのみAPIを使ってリクエストを送信したり作業したりできるようにしているんだ。
ログインに成功すると、特別なオブジェクトであるセッション(session)を取得するよ。 「サーバーとの認証済みセッション」のユニークな番号が含まれているんだ。以後のリクエストではこのオブジェクトを使う必要があるんだ。
認証
サーバーにログインするには、認証(ログインプロセス)を通過する必要があるよ。 そのためには、リクエストと一緒に認証情報を渡す必要があるんだ。
import requests
from requests.auth import HTTPBasicAuth
response = requests.get('https://httpbin.org/basic-auth/user/pass', \
auth=HTTPBasicAuth('user', 'pass'))
print(response.status_code)
これが認証プロセスさ。でも通常はセッションと一緒に使うんだ。
セッションの利用
セッションを使うと、cookiesやユーザーの認証情報など、リクエスト間でパラメーターを保存できるよ。
import requests
payload = {
'username': 'your_username',
'password': 'your_password'
}
# セッションの作成
session = requests.Session()
# サイトにログイン
login_response = session.post('https://example.com/login', data = payload)
# ログインされたユーザーとしてセッションを利用して作業
data_response = session.get('https://example.com/api/data')
print(data_response.json())
GO TO FULL VERSION