おもこん

おもこんは「思いつくままにコンピュターの話し」の省略形です

Python初級者のお勉強ノート(18)requestsモジュール

前回の記事ではJSONについて学びました。 今回はその応用として、APIを利用してデータを取得する方法を学びます。 具体的には、Pythonrequestsモジュールを使って、天気予報APIであるOpen-Meteoから気象データを取得するプログラムを作成します。

requestsモジュールの概要

requestsモジュールは、PythonでHTTPリクエストを簡単に扱うためのライブラリです。 直感的で使いやすいインターフェースを持ち、GETリクエストやPOSTリクエストをはじめとしたさまざまな操作をサポートします。

requestsモジュールのインストール方法

requestsモジュールはPythonの標準ライブラリではないため、事前にインストールが必要です。 以下のコマンドを実行してください。

pip install requests

HTTPの概要

HTTP(Hypertext Transfer Protocol)は、ウェブ上でデータをやり取りするためのプロトコルプロトコルとはやり取りのルール)です。 このやり取りをするのは、クライアントとサーバです。 例えばあなたが、ウェブサイトを見るときは、あなたのPCがクライアント、ウェブサイトのPCがサーバです。 HTTPでは、まずクライアントがサーバにリクエスト(要求)を出し、サーバがそれに応答します。

主に以下のリクエストメソッドが使用されます。

  • GET: サーバーからデータを取得する。
  • POST: サーバーにデータを送信する。
  • PUT: サーバー上のデータを更新する。
  • DELETE: サーバー上のデータを削除する。

ここでは、最も基本的なGETリクエストを使用してデータを取得します。

GETリクエストの問い合わせと応答プロセス

  1. クライアントがサーバのURLにGETリクエストを送信します。
  2. サーバーがリクエストを処理し、結果(レスポンス)を返します。
  3. クライアントはレスポンスからデータを取得して処理します。

httpbin.orgrequestsモジュールを使ったテスト

httpbin.orgは、HTTPリクエストやレスポンスの動作を確認するためのテストサービスです。 HTTPのサーバ側になります。 これを使ってrequestsモジュールの使い方を学びましょう。

import requests

url = "https://httpbin.org/get"
response = requests.get(url)

data = response.json()
print(f"取得データ: {data}")
  • requestsモジュールをインポートする。
  • getメソッドを使って、サーバにアクセスし、そのレスポンス(Responseオブジェクト)を変数responseに代入する。
  • このオブジェクトのjsonメソッドは、レスポンスがjsonに基づいている場合に使う。jsonメソッドはjsonを辞書型やリストに変更し、それを返す。

requestsモジュールで良く使うメソッドは、この記事の最後にまとめておきますので、参照してください。

Open-Meteoの概要

Open-Meteoは、無料で利用可能な気象データAPIです。以下のようなデータを取得できます。

  • 気温: 地上2メートルの気温。
  • 降水量: 1時間あたりの降水量。
  • 風速・風向: 地上10メートルの風速と風向。
  • 日射量: 太陽放射エネルギー量。

詳しいことは、Open-Meteoのウェブサイトを参照して下さい。

Open-Meteoが返すJSONデータの説明

Open-MeteoのAPIから取得したデータは、以下のようなJSON形式で返されます。

{
    'latitude': 35.676624,
    'longitude': 139.69112,
    'generationtime_ms': 0.07390975952148438,
    'utc_offset_seconds': 32400,
    'timezone': 'Asia/Tokyo',
    'timezone_abbreviation': 'JST',
    'elevation': 40.0,
    'daily_units':
        {
            'time': 'iso8601',
            'temperature_2m_max': '°C',
            'temperature_2m_min': '°C',
            'precipitation_sum': 'mm',
            'windspeed_10m_max': 'km/h',
            'wind_direction_10m_dominant': '°',
            'shortwave_radiation_sum': 'MJ/m²'
        },
    'daily':
        {
            'time': ['2024-11-01'],
            'temperature_2m_max': [21.2],
            'temperature_2m_min': [10.5],
            'precipitation_sum': [5.9],
            'windspeed_10m_max': [13.2],
            'wind_direction_10m_dominant': [345],
            'shortwave_radiation_sum': [11.03]
        }
}

実用プログラム例: Open-Meteoで東京の気象データを取得

以下のプログラムは、東京(緯度: 35.6895、経度: 139.6917)の2024年11月1日の気象データを取得し、最高気温や降水量などを箇条書きで出力します。

import requests

url = "https://archive-api.open-meteo.com/v1/archive"

params = {
    "latitude": 35.6895,
    "longitude": 139.6917,
    "daily": "temperature_2m_max,temperature_2m_min,precipitation_sum,windspeed_10m_max,wind_direction_10m_dominant,shortwave_radiation_sum",
    "timezone": "Asia/Tokyo",
    "start_date": "2024-11-01",
    "end_date": "2024-11-01"
}

response = requests.get(url, params=params)
data = response.json()

# データの整理
daily = data["daily"]
temperature_max = daily["temperature_2m_max"][0]
temperature_min = daily["temperature_2m_min"][0]
precipitation_sum = daily["precipitation_sum"][0]
windspeed = daily["windspeed_10m_max"][0]
winddirection = daily["wind_direction_10m_dominant"][0]
radiation = daily["shortwave_radiation_sum"][0]

print("2024年11月1日の東京の気象データ:")
print(f"  最高気温: {temperature_max}℃")
print(f"  最低気温: {temperature_min}℃")
print(f"  総降水量: {precipitation_sum}mm")
print(f"  最大風速: {windspeed}km/h, 風向: {winddirection}°")
print(f"  日射量: {radiation}MJ/m²")

プログラムの実行結果

PS > py w.py
2024年11月1日の東京の気象データ:
  最高気温: 21.2℃
  最低気温: 10.5℃
  総降水量: 5.9mm
  最大風速: 13.2km/h, 風向: 345°
  日射量: 11.03MJ/m²
PS >

requestsモジュールのよく使うメソッド

Pythonrequestsモジュールには、HTTPリクエストを送信するための便利なメソッドが用意されています。以下は、よく使うメソッドの解説です。

1. requests.get(url, params=None, **kwargs)

  • 用途: サーバーからデータを取得する(HTTP GETリクエスト)。
  • 主な引数:
    • url: リクエスト先のURL。
    • params: URLクエリパラメータを辞書型で指定。
  • :
response = requests.get("https://httpbin.org/get", params={"key": "value"})
print(response.url)  # https://httpbin.org/get?key=value

2. requests.post(url, data=None, json=None, **kwargs)

  • 用途: サーバーにデータを送信する(HTTP POSTリクエスト)。
  • 主な引数:
    • url: リクエスト先のURL。
    • data: フォームデータ(application/x-www-form-urlencoded形式)。
    • json: JSONデータ(application/json形式)。
  • :
response = requests.post("https://httpbin.org/post", json={"key": "value"})
print(response.json())  # サーバーが受け取ったデータを確認

3. requests.put(url, data=None, **kwargs)

  • 用途: サーバー上のリソースを更新または置換する(HTTP PUTリクエスト)。
  • 主な引数:
    • url: リクエスト先のURL。
    • data: 更新するデータ。
  • :
response = requests.put("https://httpbin.org/put", data={"key": "updated_value"})
print(response.json())

4. requests.delete(url, **kwargs)

  • 用途: サーバー上のリソースを削除する(HTTP DELETEリクエスト)。
  • 主な引数:
    • url: リクエスト先のURL。
  • :
response = requests.delete("https://httpbin.org/delete")
print(response.status_code)  # 200(成功)

5. requests.head(url, **kwargs)

  • 用途: レスポンスヘッダーのみを取得する(HTTP HEADリクエスト)。
  • 主な引数:
    • url: リクエスト先のURL。
  • :
response = requests.head("https://httpbin.org/get")
print(response.headers)

6. requests.patch(url, data=None, **kwargs)

  • 用途: サーバー上のリソースを部分的に更新する(HTTP PATCHリクエスト)。
  • 主な引数:
    • url: リクエスト先のURL。
    • data: 更新するデータ。
  • :
response = requests.patch("https://httpbin.org/patch", data={"key": "patched_value"})
print(response.json())

まとめ

この記事では以下の内容を学びました。

  1. requestsモジュールの概要と基本的な使い方。
  2. HTTP GETリクエストの仕組みとテスト方法。
  3. Open-Meteo APIの利用方法と実用的なプログラム例。

requestsモジュールを使えば、簡単にAPIを利用してデータを取得できます。 Open-MeteoのようなAPIを活用して、様々な情報を入手するプログラムを書くことが可能です。