はじめに: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(天気予報、ニュース、翻訳など)を試してみてください!
参考情報
- Requests公式ドキュメント: https://requests.readthedocs.io/en/latest/ [19, 20]
- JSONPlaceholder (テスト用API): https://jsonplaceholder.typicode.com/ [11, 18]
- 公開されているテスト用APIリストの例: https://github.com/public-apis/public-apis (APIキーが必要なものも多いので注意)
コメント