前提
- 外部APIから値を取得する際にrequestsの扱いをggrことが多いので自分用に雑多に残しておきます。
- GETメソッドを使用する機会が多いのでgetを解説していますが他メソッドも渡すパラメータ数以外は同様のやり方でOK。
実施準備
①requestsは標準モジュールではないので pip にてインストールが必要
$ pip install requests
②各プロジェクト・モジュールの準備
└── sandbox/
├── external_api.py
③今回使用するAPI => 天気予報API
requests 使用例(GET)
external_api.py
import requests
# 天気予報API(今回の外部API対象Webサイト)=>さいたま市をcity=110010の形で指定して取得
url = 'https://weather.tsukumijima.net/api/forecast/?city=110010'
# urlを引数にしてrequests.get()を行う
response = requests.get(url)
# まずはrequests.get()で取得してきた値をそのまま出力してみる
print(response)
# 出力結果: <Response [200]>
# type: <class 'requests.models.Response'>
レスポンスオブジェクトが取得できていることが分かるが、このままでは中身のデータが使えない。
下記の様に指定することでレスポンスボディやステータスコードを取得することができる。
※Requestsのget()関数で取得できるResponseオブジェクトには、JSON形式のテキストのパーサであるjson()メソッドがあり、json()メソッドはJSON形式を解析して、プログラムで扱いやすいdictやlist形式で戻してくれる(レスポンスボディ)。
external_api.py
import requests
# 天気予報API(今回の外部API対象Webサイト)
url = 'https://weather.tsukumijima.net/api/forecast/?city=110010'
response = requests.get(url)
# レスポンスのステータスコード
print(response.status_code)
# 出力結果: 200
# レスポンスのヘッダー情報
print(response.headers)
# 出力結果: {'Date': 'Sat, 17 Dec 2022 13:50:34 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Cache-Control': 'private, must-revalidate', 'pragma': 'no-cache', 'expires': '-1', 'Access-Control-Allow-Origin': '*', 'Content-Encoding': 'gzip', 'CF-Cache-Status': 'DYNAMIC', 'Report-To': '{"endpoints":[{"url":"https:\\/\\/a.nel.cloudflare.com\\/report\\/v3?s=fsimKKQYEM%2F0O2rAy0Oqipbl%2FoMaBdqgsKjvaqNsCk21%2Btt16iVbVhgCob7VpbcuyBxooQIJu0NlOPJ2BP0ZwvY4CP4BwbBT1o4ryC5vYZL5QMrPuVIiHVnnl1YtORiVv%2FT%2BHB29%2Fm3Fdg%3D%3D"}],"group":"cf-nel","max_age":604800}', 'NEL': '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}', 'Server': 'cloudflare', 'CF-RAY': '77b020e648d78089-NRT', 'alt-svc': 'h3=":443"; ma=86400, h3-29=":443"; ma=86400'}
# レスポンスボディ情報
print(response.json())
# 出力結果: {'publicTime': '2022-12-17T17:00:00+09:00', 'publicTimeFormatted': '2022/12/17 17:00:00', 'publishingOffice': '熊谷地方気象台', 'title': '埼玉県 さいたま の天気', 'link': 'https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=110000', 'description': {'publicTime': '2022-12-17T16:36:00+09:00', 'publicTimeFormatted': '2022/12/17 16:36:00', 'headlineText': '', 'bodyText': '\u3000日本海と関東の東には低気圧があって、東と東北東へ進んでいます。また、日本の南には前線を伴った別の低気圧があって東北東へ進んでいます。\n\n\u3000埼玉県は、おおむね曇りとなっています。\n\n\u300017日は、低気圧や湿った空気の影響を受ける見込みです。このため、曇りで夜は雨となり、秩父地方では雨か雪となるでしょう。\n\n\u300018日は、はじめ低気圧や湿った空気の影響を受けますが、次第に冬型の気圧配置となる見込みです。このため、南部を中心に未明まで雨となりますが、次第に晴れとなるでしょう。秩父地方は、未明まで雨か雪の降る所がある見込みです。', 'text': '\u3000日本海と関東の東には低気圧があって、東と東北東へ進んでいます。また、日本の南には前線を伴った別の低気圧があって東北東へ進んでいます。\n\n\u3000埼玉県は、おおむね曇りとなっています。\n\n\u300017日は、低気圧や湿った空気の影響を受ける見込みです。このため、曇りで夜は雨となり、秩父地方では雨か雪となるでしょう。\n\n\u300018日は、はじめ低気圧や湿った空気の影響を受けますが、次第に冬型の気圧配置となる見込みです。このため、南部を中心に未明まで雨となりますが、次第に晴れとなるでしょう。秩父地方は、未明まで雨か雪の降る所がある見込みです。'}, 'forecasts': [{'date': '2022-12-17', 'dateLabel': '今日', 'telop': '曇のち雨', 'detail': {'weather': 'くもり\u3000夜\u3000雨', 'wind': '北西の風', 'wave': None}, 'temperature': {'min': {'celsius': None, 'fahrenheit': None}, 'max': {'celsius': None, 'fahrenheit': None}}, 'chanceOfRain': {'T00_06': '--%', 'T06_12': '--%', 'T12_18': '--%', 'T18_24': '60%'}, 'image': {'title': '曇のち雨', 'url': 'https://www.jma.go.jp/bosai/forecast/img/212.svg', 'width': 80, 'height': 60}}, {'date': '2022-12-18', 'dateLabel': '明日', 'telop': '晴れ', 'detail': {'weather': '晴れ\u3000明け方\u3000まで\u3000くもり\u3000所により\u3000未明\u3000雨', 'wind': '北西の風\u3000日中\u3000やや強く', 'wave': None}, 'temperature': {'min': {'celsius': '0', 'fahrenheit': '32'}, 'max': {'celsius': '10', 'fahrenheit': '50'}}, 'chanceOfRain': {'T00_06': '20%', 'T06_12': '10%', 'T12_18': '0%', 'T18_24': '0%'}, 'image': {'title': '晴れ', 'url': 'https://www.jma.go.jp/bosai/forecast/img/100.svg', 'width': 80, 'height': 60}}, {'date': '2022-12-19', 'dateLabel': '明後日', 'telop': '晴時々曇', 'detail': {'weather': '晴れ\u3000時々\u3000くもり', 'wind': '南西の風\u3000後\u3000北西の風', 'wave': None}, 'temperature': {'min': {'celsius': '0', 'fahrenheit': '32'}, 'max': {'celsius': '10', 'fahrenheit': '50'}}, 'chanceOfRain': {'T00_06': '10%', 'T06_12': '10%', 'T12_18': '10%', 'T18_24': '10%'}, 'image': {'title': '晴時々曇', 'url': 'https://www.jma.go.jp/bosai/forecast/img/101.svg', 'width': 80, 'height': 60}}], 'location': {'area': '関東', 'prefecture': '埼玉県', 'district': '南部', 'city': 'さいたま'}, 'copyright': {'title': '(C) 天気予報 API(livedoor 天気互換)', 'link': 'https://weather.tsukumijima.net/', 'image': {'title': '天気予報 API(livedoor 天気互換)', 'link': 'https://weather.tsukumijima.net/', 'url': 'https://weather.tsukumijima.net/logo.png', 'width': 120, 'height': 120}, 'provider': [{'link': 'https://www.jma.go.jp/jma/', 'name': '気象庁 Japan Meteorological Agency', 'note': '気象庁 HP にて配信されている天気予報を JSON データへ編集しています。'}]}}
# レスポンスボディの内 titleを取得してみる
print(response.json()["title"])
# 出力結果: 埼玉県 さいたま の天気
参考