こんにちはフロントエンドエンジニアのまさにょんです!
今回は、PythonでHTTP通信(Get・Post)を実装する方法の1つである「requests」モジュールの使い方について解説します。
Sampleでは、実際にPythonでAPIとHTTP通信をします。
目次
requestsモジュールとは?
requestsモジュールは、HTTP通信を行うためのPythonのモジュールです。
標準ライブラリである urllibモジュールより使いやすいのが特徴です。
HTTP通信についてわからない場合は、ぜひこちらの記事も見てみてください。
requests モジュールをインストールする
# requests モジュールをインストールする
pip install requests
APIとHTTP通信をする Ver. Get通信
まずは、APIとのGet通信を見ていきます。
requestsモジュールの getメソッドでGETリクエストを送信することができます。
今回は、データを確認するために、pprint や vars() で標準出力しています。
import requests
import pprint
# get()メソッドでGETリクエストを送信する => {JSON}placeholderを利用する
response = requests.get("https://jsonplaceholder.typicode.com/todos/1")
# 結果を出力する => Response-Object を取得している
pprint.pprint(response)
### 出力結果 ###
# <Response [200]>
# vars() を利用すると、オブジェクトの中身を見ることができる。
pprint.pprint(vars(response))
### 出力結果 ###
# {
# '_content': b'{
# \n "userId": 1,\n "id": 1,\n "title": "delectus aut autem",'
# b'\n "completed": false\n
# }',
# '_content_consumed': True,
# '_next': None,
# 'connection': <requests.adapters.HTTPAdapter object at 0x000002A58A35DD20>,
# 'cookies': <RequestsCookieJar[]>,
# 'elapsed': datetime.timedelta(microseconds=44549),
# 'encoding': 'utf-8',
# 'headers': {
# 'Date': 'Thu, 22 Sep 2022 06:23:12 GMT', 'Content-Type': 'application/json; charset=utf-8',
# 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Powered-By': 'Express',
# 'X-Ratelimit-Limit': '1000', 'X-Ratelimit-Remaining': '999', 'X-Ratelimit-Reset': '1652380831',
# 'Vary': 'Origin, Accept-Encoding', 'Access-Control-Allow-Credentials': 'true',
# 'Cache-Control': 'max-age=43200', 'Pragma': 'no-cache', 'Expires': '-1',
# 'X-Content-Type-Options': 'nosniff', 'Etag': 'W/"53-hfEnumeNh6YirfjyjaujcOPPT+s"',
# 'Via': '1.1 vegur', 'CF-Cache-Status': 'HIT', 'Age': '3971',
# 'Report-To': '{
# "endpoints":[
# {
# "url":"https:\\/\\/a.nel.cloudflare.com\\/report\\/v3?s=60c%2FbYflPnu9x8vcRkdWAjMaRrahrTdzY21cm84m%2Bmk8aaPbd9p8HASiJ78uBVKSmbZhVfA9pkScB6jugeYiUrbEaEZQ0qqfhFd%2F51V3DKQXotazgWXxE42dcccygcdSzeF7hin4wC0%2Fy5D3JIGK"
# }
# ],
# "group":"cf-nel","max_age":604800
# }',
# 'NEL': '{
# "success_fraction":0,"report_to":"cf-nel","max_age":604800
# }',
# 'Server': 'cloudflare', 'CF-RAY': '74e8f355c99d80a1-NRT',
# 'Content-Encoding': 'gzip', 'alt-svc': 'h3=":443"; ma=86400, h3-29=":443"; ma=86400'
# },
# 'history': [],
# 'raw': <urllib3.response.HTTPResponse object at 0x000002A58A3F71C0>,
# 'reason': 'OK',
# 'request': <PreparedRequest [GET]>,
# 'status_code': 200,
# 'url': 'https://jsonplaceholder.typicode.com/todos/1'
# }
レスポンスのオブジェクトから値を取り出す関数
Response-Object から値を取り出すためのメソッドやプロパティが、Response-Objectには用意されています。
主なメソッドやプロパティと、そこから取得できるデータは次のとおりです。
メソッド or プロパティ | 実行結果 |
response.json() | JSON形式でレスポンスボディを取得 |
response.status_code | ステータスコードを取得 |
response.headers | レスポンスヘッダを取得 |
response.text | レスポンスボディを普通に取得 |
response.url | リクエスト時のURLを取得 |
それでは、実際に各メソッド・プロパティの実行結果をCodeで確認していきましょう。
import requests
import pprint
# get()メソッドでGETリクエストを送信する
response = requests.get("https://jsonplaceholder.typicode.com/todos/1")
# 結果を出力する => Response-Object を取得している
pprint.pprint(response)
### 出力結果 ###
# <Response [200]>
# vars()関数を利用すると、オブジェクトの中身を見ることができる。
pprint.pprint(vars(response))
pprint.pprint(response.json())
# {'completed': False, 'id': 1, 'title': 'delectus aut autem', 'userId': 1}
# response.json() で取得したJSON-オブジェクトは、Dict型
jsonData = response.json()
# Dict型なので、key名で参照する
id = jsonData['id']
title = jsonData['title']
print('id: ', id)
print('title: ', title)
### 出力結果 ###
# id: 1
# title: delectus aut autem
pprint.pprint(response.status_code)
# 200
pprint.pprint(response.text)
# ('{\n'
# ' "userId": 1,\n'
# ' "id": 1,\n'
# ' "title": "delectus aut autem",\n'
# ' "completed": false\n'
# '}')
pprint.pprint(response.headers)
# {'Date': 'Thu, 22 Sep 2022 06:30:58 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'x-powered-by': 'Express', 'x-ratelimit-limit': '1000', 'x-ratelimit-remaining': '999', 'x-ratelimit-reset': '1639535659', 'vary':
# 'Origin, Accept-Encoding', 'access-control-allow-credentials': 'true', 'cache-control': 'max-age=43200', 'pragma': 'no-cache', 'expires': '-1', 'x-content-type-options': 'nosniff', 'etag': 'W/"53-hfEnumeNh6YirfjyjaujcOPPT+s"', 'via': '1.1 vegur', 'CF-Cache-Status': 'HIT', 'Age': '28277', 'Report-To': '{"endpoints":[{"url":"https:\\/\\/a.nel.cloudflare.com\\/report\\/v3?s=YRgNgw%2FKEj3tcBmTmq%2FUAyCDf%2BLqQz%2BNn6Mk1LOJywsMXlR82jTeMz1qBVXDZrPHN9SVuvVmGPSDm6zBVQ1kAFPcpfPSGIkCzsB7e0KZV6P4bttrLvTOMMgUMG3Dv78aycPPkk1tdXMOMn05wf1S"}],"group":"cf-nel","max_age":604800}', 'NEL': '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}', 'Server': 'cloudflare', 'CF-RAY': '74e8feb77d61202b-NRT', 'Content-Encoding': 'gzip', 'alt-svc': 'h3=":443"; ma=86400, h3-29=":443"; ma=86400'}
pprint.pprint(response.url)
# 'https://jsonplaceholder.typicode.com/todos/1'
APIとHTTP通信をする Ver. Post通信
次にAPIとのPost通信の実装を見ていきましょう。
requestsモジュールのpostメソッドで、Post通信をすることができます。
Postの場合、リクエストヘッダやリクエストボディの設定をすることが多いです。
リクエストボディは「json=」で指定します。
また、リクエストヘッダを付与する際は「headers=」で指定できます。
import requests
import pprint
# Post-URL => {JSON}placeholderを利用する
POST_URL = "https://jsonplaceholder.typicode.com/posts"
# リクエストボディを定義
request_body = {'title': 'robotama', 'body': 'purupuru', 'userId': 1}
# postメソッドで、リクエストボディ付きでPost通信 => レスポンス・オブジェクトを受け取る
response = requests.post(POST_URL, json=request_body)
# response.json() で取得したJSON-オブジェクトは、Dict型
jsonData = response.json()
# JSON形式でレスポンスボディを取得 => pprintで出力
pprint.pprint(jsonData)
# 出力結果
# {'body': 'purupuru', 'id': 101, 'title': 'robotama', 'userId': 1}
# Dict型なので、key名で参照する
body = jsonData['body']
title = jsonData['title']
print(body, title)
# purupuru robotama
SampleCode全文
import requests
import pprint
# PythonでHTTPリクエストを送信する時に利用できるライブラリは2種類ある。
# 1 urllib 標準ライブラリ やや使いにくい
# 2 Requests 標準ライブラリではない 使いやすい
# 今回は、Requestsを使ったHTTPリクエストについて解説する。
# requests をインストールする
# pip install requests
# get()メソッドでGETリクエストを送信する
response = requests.get("https://jsonplaceholder.typicode.com/todos/1")
# 結果を出力する
pprint.pprint(response)
# <Response [200]>
# Response-Objectを取得した🔥
# => リクエスト結果のオブジェクトが取得できる
# 値を取り出すための様々な関数が用意されている。
# オブジェクトの中身をそのまま出力すると
# どんな値を保持しているのかを確認することができる。
# vars()関数を利用すると、オブジェクトの中身を見ることができる。
pprint.pprint(vars(response))
# {
# '_content': b'{
# \n "userId": 1,\n "id": 1,\n "title": "delectus aut autem",'
# b'\n "completed": false\n
# }',
# '_content_consumed': True,
# '_next': None,
# 'connection': <requests.adapters.HTTPAdapter object at 0x000002A58A35DD20>,
# 'cookies': <RequestsCookieJar[]>,
# 'elapsed': datetime.timedelta(microseconds=44549),
# 'encoding': 'utf-8',
# 'headers': {
# 'Date': 'Thu, 22 Sep 2022 06:23:12 GMT', 'Content-Type': 'application/json; charset=utf-8',
# 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Powered-By': 'Express',
# 'X-Ratelimit-Limit': '1000', 'X-Ratelimit-Remaining': '999', 'X-Ratelimit-Reset': '1652380831',
# 'Vary': 'Origin, Accept-Encoding', 'Access-Control-Allow-Credentials': 'true',
# 'Cache-Control': 'max-age=43200', 'Pragma': 'no-cache', 'Expires': '-1',
# 'X-Content-Type-Options': 'nosniff', 'Etag': 'W/"53-hfEnumeNh6YirfjyjaujcOPPT+s"',
# 'Via': '1.1 vegur', 'CF-Cache-Status': 'HIT', 'Age': '3971',
# 'Report-To': '{
# "endpoints":[
# {
# "url":"https:\\/\\/a.nel.cloudflare.com\\/report\\/v3?s=60c%2FbYflPnu9x8vcRkdWAjMaRrahrTdzY21cm84m%2Bmk8aaPbd9p8HASiJ78uBVKSmbZhVfA9pkScB6jugeYiUrbEaEZQ0qqfhFd%2F51V3DKQXotazgWXxE42dcccygcdSzeF7hin4wC0%2Fy5D3JIGK"
# }
# ],
# "group":"cf-nel","max_age":604800
# }',
# 'NEL': '{
# "success_fraction":0,"report_to":"cf-nel","max_age":604800
# }',
# 'Server': 'cloudflare', 'CF-RAY': '74e8f355c99d80a1-NRT',
# 'Content-Encoding': 'gzip', 'alt-svc': 'h3=":443"; ma=86400, h3-29=":443"; ma=86400'
# },
# 'history': [],
# 'raw': <urllib3.response.HTTPResponse object at 0x000002A58A3F71C0>,
# 'reason': 'OK',
# 'request': <PreparedRequest [GET]>,
# 'status_code': 200,
# 'url': 'https://jsonplaceholder.typicode.com/todos/1'
# }
# Response-Object から値を取り出すための様々な関数が用意されている。
# 簡単に説明すると
# response.json(): JSON形式でレスポンスボディを取得
# response.status_code: ステータスコードを取得
# response.headers: レスポンスヘッダを取得
# response.text: レスポンスボディを普通に取得
# response.url: リクエスト時のURLを取得
# といった要領で様々なデータを取得することができる。
pprint.pprint(response.json())
# {'completed': False, 'id': 1, 'title': 'delectus aut autem', 'userId': 1}
pprint.pprint(response.status_code)
# 200
pprint.pprint(response.text)
# ('{\n'
# ' "userId": 1,\n'
# ' "id": 1,\n'
# ' "title": "delectus aut autem",\n'
# ' "completed": false\n'
# '}')
pprint.pprint(response.headers)
# {'Date': 'Thu, 22 Sep 2022 06:30:58 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'x-powered-by': 'Express', 'x-ratelimit-limit': '1000', 'x-ratelimit-remaining': '999', 'x-ratelimit-reset': '1639535659', 'vary':
# 'Origin, Accept-Encoding', 'access-control-allow-credentials': 'true', 'cache-control': 'max-age=43200', 'pragma': 'no-cache', 'expires': '-1', 'x-content-type-options': 'nosniff', 'etag': 'W/"53-hfEnumeNh6YirfjyjaujcOPPT+s"', 'via': '1.1 vegur', 'CF-Cache-Status': 'HIT', 'Age': '28277', 'Report-To': '{"endpoints":[{"url":"https:\\/\\/a.nel.cloudflare.com\\/report\\/v3?s=YRgNgw%2FKEj3tcBmTmq%2FUAyCDf%2BLqQz%2BNn6Mk1LOJywsMXlR82jTeMz1qBVXDZrPHN9SVuvVmGPSDm6zBVQ1kAFPcpfPSGIkCzsB7e0KZV6P4bttrLvTOMMgUMG3Dv78aycPPkk1tdXMOMn05wf1S"}],"group":"cf-nel","max_age":604800}', 'NEL': '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}', 'Server': 'cloudflare', 'CF-RAY': '74e8feb77d61202b-NRT', 'Content-Encoding': 'gzip', 'alt-svc': 'h3=":443"; ma=86400, h3-29=":443"; ma=86400'}
pprint.pprint(response.url)
# 'https://jsonplaceholder.typicode.com/todos/1'
# POSTの使い方もGETとほぼ同じである。
# POSTの場合、リクエストヘッダやリクエストボディを設定するケースが多い。
# その場合は、引数に指定するだけでOKである。
# リクエストボディ:json=で指定
# リクエストヘッダ:headers=で指定
POST_URL = "https://jsonplaceholder.typicode.com/posts"
# リクエストボディを定義する
request_body = {'title': 'robotama', 'body': 'purupuru', 'userId': 1}
# POSTリクエストを、リクエストボディ付きで送信する
response = requests.post(POST_URL, json=request_body)
# レスポンスボディを出力する
pprint.pprint(response.json())
# 出力結果
# {'body': 'purupuru', 'id': 101, 'title': 'robotama', 'userId': 1}
Twitterやってます!Follow Me!
神聖グンマー帝国の逆襲🔥
神聖グンマー帝国の科学は、世界一ぃぃぃぃぃぃ!!!!!