[Pythonのはじめ方] Part31: requestsによるWeb APIの利用

Python

はじめに:Web APIとrequestsライブラリとは? 🤔

インターネット上には、天気予報、株価情報、地図データなど、様々な情報を提供するサービスがあります。これらの多くは、Web API (Application Programming Interface) という仕組みを通じて、プログラムから利用できるようになっています。 Web APIは、特定のURLにアクセスすることで、決まった形式のデータを取得したり、データを送信したりできるインターフェースです。[23, 28, 29]

PythonでWeb APIを利用する際に非常に便利なのが、requestsライブラリです。requestsは、Python標準のurllibよりもシンプルで直感的にHTTPリクエストを送受信できるため、多くの開発者に愛用されています。[2, 14, 15, 20, 22] このライブラリを使えば、Web上のデータを簡単に取得したり、外部サービスと連携したりするプログラムを作成できます。

このステップでは、requestsライブラリを使ってWeb APIから情報を取得する方法や、データを送信する方法を学んでいきましょう! 🚀

Requestsライブラリのインストール 💻

requestsはPythonの標準ライブラリではないため、利用するにはまずインストールが必要です。[8, 14, 21] Pythonのパッケージ管理ツールであるpipを使って、以下のコマンドを実行します。

pip install requests

(環境によっては pip3 を使う必要があるかもしれません)[1]

これで、requestsライブラリを使う準備が整いました!

基本的な使い方:GETリクエストで情報を取得する 📥

Web APIから情報を取得する最も基本的な方法は、GETリクエストを送ることです。[6, 13, 14] これは、ブラウザでWebページを開くのと同じような操作です。requestsでは、requests.get()関数を使います。

例として、JSONPlaceholderという、テスト用のダミーAPIから情報を取得してみましょう。[11, 18]

import requests

# APIのエンドポイントURL
url = 'https://jsonplaceholder.typicode.com/posts/1'

# GETリクエストを送信
response = requests.get(url)

# レスポンスの状態を確認
print(f"ステータスコード: {response.status_code}") # HTTPステータスコードを表示

# レスポンスの内容を表示 (テキスト形式)
# print(f"レスポンスボディ (テキスト): {response.text}") # .textでテキスト内容を取得 [1, 13]

# レスポンスの内容を表示 (JSON形式)
if response.status_code == 200: # ステータスコードが200 (OK) の場合のみ処理
    try:
        json_data = response.json() # .json()メソッドでJSONデータをPythonの辞書に変換 [4, 8, 11, 12, 14]
        print("レスポンスボディ (JSON):")
        print(json_data)
        print(f"タイトル: {json_data['title']}") # 特定のキーの値を取得
    except requests.exceptions.JSONDecodeError:
        print("レスポンスはJSON形式ではありません。")
else:
    print(f"リクエスト失敗: {response.status_code}")

上記のコードでは、まずrequests.get()で指定したURLにGETリクエストを送信し、その結果をresponseという変数(Responseオブジェクト)に格納しています。[1, 5, 8]

次に、response.status_codeでHTTPステータスコードを確認しています。[8, 13, 14] ステータスコードはリクエストの結果を示す数値で、200は成功(OK)を意味します。[26]

APIからのレスポンスがJSON形式の場合、response.json()メソッドを使うと、JSONデータをPythonの辞書やリストに簡単に変換できます。[4, 8, 11, 12, 14] これにより、データへのアクセスが容易になります。もしレスポンスがJSON形式でない場合に.json()を呼び出すとエラーになるため、try-exceptブロックで囲むか、事前にContent-Typeヘッダーを確認するとより安全です。[4]

WebページのHTMLなどを取得したい場合は、response.text属性を使います。[1] これはレスポンスの内容を文字列として返します。

クエリパラメータを使って情報を絞り込む 🔍

特定の条件で情報を絞り込みたい場合、URLの末尾に?を付けてパラメータを追加します。これをクエリパラメータと呼びます。[1] requestsでは、params引数に辞書を指定することで、簡単にクエリパラメータを付与できます。[5, 13]

import requests

url = 'https://jsonplaceholder.typicode.com/comments'
# userIdが1のコメントだけを取得するためのパラメータ
params = {'postId': 1}

# params引数に辞書を指定してGETリクエスト
response = requests.get(url, params=params)

print(f"リクエストURL: {response.url}") # 実際に送信されたURLを確認
print(f"ステータスコード: {response.status_code}")

if response.status_code == 200:
    try:
        comments = response.json()
        print(f"取得したコメント数: {len(comments)}")
        # 最初のコメントのemailを表示
        if comments:
            print(f"最初のコメントのEmail: {comments[0]['email']}")
    except requests.exceptions.JSONDecodeError:
        print("レスポンスはJSON形式ではありません。")
else:
    print(f"リクエスト失敗: {response.status_code}")

params={'postId': 1}と指定すると、requestsは自動的にURLの末尾に?postId=1を追加してくれます。[5, 13] 複数のパラメータを指定する場合は、辞書にキーと値を追加していくだけです。

POSTリクエストでデータを送信する 📤

Web APIに対して新しいデータを作成したり、情報を送信したりする場合は、POSTリクエストを使います。[6, 13] requestsではrequests.post()関数を使用します。送信するデータは、data引数(フォームデータ)またはjson引数(JSONデータ)で指定します。[5, 6, 7, 9, 10]

最近のWeb APIではJSON形式でデータをやり取りすることが主流なので、json引数を使うのが便利です。[7, 10, 15, 22] json引数を使うと、requestsが自動的にデータをJSON形式に変換し、適切なヘッダー (Content-Type: application/json) を設定してくれます。[10, 15]

import requests
import json # jsonモジュールは不要な場合が多いが、明示的に使う場合はインポート

url = 'https://jsonplaceholder.typicode.com/posts'

# 送信するデータ (Pythonの辞書)
new_post = {
    'title': '新しい投稿のタイトル',
    'body': 'これは新しい投稿の本文です。',
    'userId': 1
}

# json引数を使ってPOSTリクエスト
# requestsが辞書をJSON文字列に変換し、ヘッダーも自動設定してくれる [10, 15]
response = requests.post(url, json=new_post)

print(f"ステータスコード: {response.status_code}") # 201 Created が返ってくることが多い [26]

if response.status_code == 201: # 201はリソース作成成功を示すステータスコード
    try:
        created_post = response.json()
        print("作成された投稿データ:")
        print(created_post)
    except requests.exceptions.JSONDecodeError:
        print("レスポンスはJSON形式ではありません。")
else:
    print(f"リクエスト失敗: {response.status_code}")
    # print(response.text) # エラー内容を確認する場合

# data引数を使う場合 (フォームデータとして送信)
# data_payload = {
#     'title': 'フォームデータのタイトル',
#     'body': 'フォームデータの本文',
#     'userId': '2' # 通常、フォームデータは文字列として扱われる
# }
# response_data = requests.post(url, data=data_payload)
# print(f"\ndata引数でのステータスコード: {response_data.status_code}")
# print(response_data.json())

data引数を使う場合は、主にHTMLフォームのようなデータを送信する際に利用します。[5] データをJSON文字列として直接data引数に渡す場合は、json.dumps()で文字列に変換し、headers引数でContent-Type: application/jsonを明示的に指定する必要があります。[6, 7] しかし、通常はjson引数を使う方が簡単です。[10, 15]

その他の機能と注意点 ✨

  • ヘッダーの指定 (headers引数): APIによっては、認証情報 (APIキーなど) や受け入れ可能なデータ形式 (Acceptヘッダー) などをHTTPヘッダーで送信する必要があります。[1, 4, 5] headers引数に辞書形式で指定できます。
    headers = {
        'Authorization': 'Bearer YOUR_API_KEY',
        'Accept': 'application/json'
    }
    response = requests.get(url, headers=headers)
  • レスポンスの確認: response.status_codeでステータスコードを確認するだけでなく、response.headersでレスポンスヘッダーを、response.encodingでエンコーディングを確認できます。[1, 8, 20, 22] response.elapsedでリクエストにかかった時間も取得できます。[17]
  • エラーハンドリング: response.raise_for_status()メソッドを使うと、リクエストが失敗した場合(ステータスコードが4xxまたは5xxの場合)にHTTPError例外を発生させることができます。try...exceptと組み合わせると便利です。
  • タイムアウト設定 (timeout引数): ネットワークの問題などで応答が長時間返ってこない場合に備え、タイムアウト時間を秒数で指定できます。[5, 14, 15]
    try:
        response = requests.get(url, timeout=5) # 5秒でタイムアウト
        response.raise_for_status() # エラーがあれば例外発生
        # 成功時の処理
    except requests.exceptions.Timeout:
        print("リクエストがタイムアウトしました。")
    except requests.exceptions.RequestException as e:
        print(f"リクエスト中にエラーが発生しました: {e}")
  • セッション (requests.Session): 複数のリクエスト間でCookieを保持したり、接続を再利用してパフォーマンスを向上させたい場合は、Sessionオブジェクトを使うと便利です。[2, 15, 20]

まとめ 🎉

今回は、Pythonのrequestsライブラリを使ってWeb APIを利用する方法を学びました。

  • pip install requestsでインストールする。[2]
  • requests.get()でデータを取得する。[1, 14]
  • params引数でクエリパラメータを指定する。[1, 5]
  • requests.post()でデータを送信する(json引数が便利)。[5, 6, 7, 10]
  • response.status_codeで結果を確認し、response.json()でJSONデータを扱う。[4, 8, 14]
  • headers引数やtimeout引数、エラーハンドリングも重要。[1, 5, 14]

requestsライブラリを使えば、様々なWeb APIと連携して、より高度で便利なプログラムを作成できます。ぜひ色々な公開API(天気予報、ニュース、翻訳など)を試してみてください!

参考情報

コメント

タイトルとURLをコピーしました