コンテンツにスキップ
LinkedInX

Python API呼び出し入門

約5分

対象読者: Pythonの基本(変数・関数・辞書)を理解している方でAPIを使ったことがない方

API(Application Programming Interface)呼び出しとは、外部のサービスやデータにプログラムからアクセスするための仕組みです。PythonでAIサービスや各種Webサービスを利用する際、APIは欠かせない技術です。requestsライブラリを使えば、数行のコードでAPIの呼び出しと結果の処理ができます。

APIはHTTPプロトコル(Webで使われる通信規格)を通じてデータをやり取りします。主なHTTPメソッドを覚えておきましょう。

メソッド用途
GETデータを取得するユーザー情報を取得、記事一覧を取得
POST新しいデータを作成するメッセージを送信、ファイルをアップロード
PUTデータを更新する(全体)プロフィール情報を更新
PATCHデータを一部更新する名前だけを変更
DELETEデータを削除する投稿を削除

AIサービスのAPI(Claude、OpenAIなど)への呼び出しは、ほとんどの場合 POST を使います。

requestsライブラリのインストール

Section titled “requestsライブラリのインストール”
pip install requests

インストール確認:

import requests
print(requests.__version__)  # 例: 2.31.0

GETリクエスト:データを取得する

Section titled “GETリクエスト:データを取得する”

JSONPlaceholder は学習用の無料APIです。実際にリクエストを送って試せます。

import requests

# GETリクエストを送る
response = requests.get("https://jsonplaceholder.typicode.com/posts/1")

# HTTPステータスコードを確認する
print(response.status_code)  # 200(成功)

# JSONデータとして受け取る
data = response.json()
print(data)
# {
#   'userId': 1,
#   'id': 1,
#   'title': 'sunt aut facere repellat...',
#   'body': 'quia et suscipit...'
# }

# 特定のフィールドを取り出す
print(data["title"])
print(data["body"])

URLに ?key=value の形式でパラメータを付けると、検索や絞り込みができます。requestsでは params 引数を使います。

import requests

# 手動でURLを組み立てる代わりに params を使う
# 実際のURL: https://jsonplaceholder.typicode.com/posts?userId=1
response = requests.get(
    "https://jsonplaceholder.typicode.com/posts",
    params={"userId": 1}
)

posts = response.json()
print(f"取得した投稿数: {len(posts)}")
for post in posts[:3]:  # 最初の3件を表示
    print(f"  - {post['title'][:40]}...")

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

Section titled “POSTリクエスト:データを送信する”
import requests

# 送信するデータを辞書で定義する
new_post = {
    "title": "Python API入門",
    "body": "requestsライブラリを使ってAPIを呼び出す方法を学びます",
    "userId": 1
}

# POSTリクエストを送る(jsonパラメータを使うとContent-Typeが自動設定される)
response = requests.post(
    "https://jsonplaceholder.typicode.com/posts",
    json=new_post
)

print(response.status_code)  # 201(作成成功)
created = response.json()
print(f"作成されたID: {created['id']}")
引数Content-Type用途
json=dictapplication/jsonREST API(AIサービスなど)への送信
data=dictapplication/x-www-form-urlencodedHTMLフォームと同じ形式

AI APIはほぼ全て json= を使います。

APIは常に成功するとは限りません。エラーへの対処を実装しましょう。

import requests

response = requests.get("https://jsonplaceholder.typicode.com/posts/999")

if response.status_code == 200:
    print("成功:", response.json())
elif response.status_code == 404:
    print("見つかりません(404)")
elif response.status_code == 429:
    print("リクエスト制限に達しました(429)。しばらく待ってください。")
elif response.status_code >= 500:
    print(f"サーバーエラー({response.status_code})")
else:
    print(f"エラー: {response.status_code}")

より簡潔なエラーチェック方法:

import requests

try:
    response = requests.get("https://jsonplaceholder.typicode.com/posts/1")
    response.raise_for_status()  # 4xx/5xxのとき例外を発生させる
    data = response.json()
    print(data["title"])

except requests.exceptions.HTTPError as e:
    print(f"HTTPエラー: {e}")
except requests.exceptions.ConnectionError:
    print("ネットワーク接続エラー。インターネット接続を確認してください。")
except requests.exceptions.Timeout:
    print("タイムアウト。サーバーの応答に時間がかかりすぎています。")
except requests.exceptions.RequestException as e:
    print(f"予期しないエラー: {e}")
import requests

# timeout=(接続タイムアウト秒, 読み取りタイムアウト秒)
response = requests.get(
    "https://jsonplaceholder.typicode.com/posts/1",
    timeout=(5, 30)  # 接続5秒、読み取り30秒で失敗とみなす
)

タイムアウトを設定しないと、サーバーが応答しない場合にプログラムが永遠に待ち続けます。必ず設定してください。

多くのAPIは認証が必要です。APIキーをリクエストヘッダーに含めます。

import requests
import os

# APIキーは環境変数から読み込む(コードに直接書かない)
api_key = os.environ.get("MY_API_KEY")

headers = {
    "Authorization": f"Bearer {api_key}",
    "Content-Type": "application/json",
    "User-Agent": "MyApp/1.0"  # アプリの識別情報(任意)
}

response = requests.get(
    "https://api.example.com/data",
    headers=headers,
    timeout=10
)

APIキーを "Bearer " の後に付ける形式(Bearer認証)は、AI APIを含む多くのREST APIで使われる標準的な方式です。

実践例:公開APIを呼び出してデータを表示する

Section titled “実践例:公開APIを呼び出してデータを表示する”

実際に動く例として、GitHubの公開APIを使ってリポジトリ情報を取得します。

import requests
import json

def get_github_repo_info(owner: str, repo: str) -> dict | None:
    """GitHubリポジトリの基本情報を取得する"""
    url = f"https://api.github.com/repos/{owner}/{repo}"
    headers = {
        "Accept": "application/vnd.github.v3+json",
        "User-Agent": "python-api-tutorial"
    }

    try:
        response = requests.get(url, headers=headers, timeout=10)
        response.raise_for_status()
        return response.json()

    except requests.exceptions.HTTPError as e:
        if response.status_code == 404:
            print(f"リポジトリが見つかりません: {owner}/{repo}")
        else:
            print(f"HTTPエラー: {e}")
        return None

    except requests.exceptions.RequestException as e:
        print(f"通信エラー: {e}")
        return None

def display_repo_info(info: dict) -> None:
    """リポジトリ情報を見やすく表示する"""
    print(f"リポジトリ: {info['full_name']}")
    print(f"説明: {info.get('description', '(説明なし)')}")
    print(f"スター数: {info['stargazers_count']:,}")
    print(f"フォーク数: {info['forks_count']:,}")
    print(f"主な言語: {info.get('language', '不明')}")
    print(f"最終更新: {info['updated_at'][:10]}")

# 実行
info = get_github_repo_info("anthropics", "anthropic-sdk-python")
if info:
    display_repo_info(info)

実行結果の例:

リポジトリ: anthropics/anthropic-sdk-python
説明: The official Python library for the Anthropic API
スター数: 4,123
フォーク数: 456
主な言語: Python
最終更新: 2026-05-10

セッションを使って効率化する

Section titled “セッションを使って効率化する”

同じホストへ複数回リクエストする場合、requests.Session を使うとTCPコネクションを再利用でき、パフォーマンスが向上します。

import requests

# セッションを作成する
with requests.Session() as session:
    # セッション共通のヘッダーを設定する
    session.headers.update({
        "Authorization": "Bearer my-api-key",
        "Content-Type": "application/json"
    })

    # 同じセッションで複数のリクエストを送る
    response1 = session.get("https://api.example.com/users/1")
    response2 = session.get("https://api.example.com/users/2")
    response3 = session.post("https://api.example.com/messages", json={"text": "hello"})
  • requests.get() でデータを取得し、.json() でPythonの辞書として扱う
  • requests.post(url, json=data) でデータを送信する
  • raise_for_status()try/except でエラーを適切に処理する
  • APIキーは環境変数から読み込み、コードに直接書かない
  • timeout を必ず設定する
  • 同じホストへの連続リクエストには Session を使う

次のステップとして、PythonでのJSON処理でAPIレスポンスのより高度な処理方法を学び、Python × AI SDK実践でAI APIの呼び出しに進みましょう。

Q: requestsとhttplibやurllib.requestの違いは何ですか?

A: urllib.request はPython標準ライブラリで追加インストール不要ですが、記述が冗長です。requests はサードパーティライブラリですが、シンプルで直感的なAPIを提供します。実務ではrequests(または非同期のhttpx)が広く使われます。

Q: APIのレートリミット(制限)にかかったときはどうすればいいですか?

A: ステータスコード429が返ります。Retry-After ヘッダーで待機時間が指定されることがあります。time.sleep() で待機してから再試行するか、tenacityのような再試行ライブラリを使います。

Q: 非同期でAPIを呼び出したい場合はどうすればいいですか?

A: asynciohttpx ライブラリを組み合わせます。複数のAPIを並行して呼び出す場合や、FastAPIのような非同期フレームワークと組み合わせる場合に有効です。

Q: HTTPS通信の証明書エラーが出る場合は?

A: 社内のプロキシやカスタムCA証明書が必要な場合があります。requests.get(url, verify="/path/to/ca-bundle.crt") で証明書を指定するか、IT部門に相談してください。verify=False は本番環境では絶対に使わないでください。

このページの外部仕様・背景情報は、参考文献を参照してください。[1][2]

  1. Python Software Foundation, The Python Tutorial
  2. OpenAI, OpenAI API documentation
クイズ