Day 47:requestsで「PythonからWebに話しかける」感覚をつかむ
Day 47では、PythonでHTTPを扱うときの定番ライブラリ requests をじっくり触っていきます。 昨日のDay 46で「HTTPとは?」「GETとは?」という土台を作ったので、 今日はそれを 「実際にコードで使う」 フェーズに進めるイメージです。
テーマはこの4つです。
- GET
- パラメータ
- ヘッダー
- JSON
雑誌記事を読むような感覚で、 でも中身はしっかり本格派、というバランスで進めていきます。
requestsとは:HTTPを「やさしくしてくれる」ライブラリ
標準ライブラリよりも、ずっと書きやすい
Pythonには標準ライブラリとして urllib などがありますが、 それらは少し書き方が固くて、初心者にはとっつきにくいところがあります。
そこで登場するのが requests。
- シンプルな書き方
- 分かりやすいメソッド名(
get,postなど) - レスポンスの扱いも直感的
ということで、「PythonでHTTPやAPIを触るなら、まずrequestsから」と言われるくらい定番です。
インストールは一度だけ、こんな感じです。
bash
pip install requests
基本のGET:まずは「ページを取りに行く」感覚から
一番シンプルなGETリクエスト
まずは、「URLにアクセスして、返事をもらう」 という基本の動きをコードで見てみます。
# day47_requests_get_basic.py
import requests # HTTP通信を簡単にしてくれる人気ライブラリです。
def basic_get():
"""シンプルなGETリクエストの例です。"""
# アクセスしたいURLを指定します。
url = "https://httpbin.org/get"
# GETリクエストを送ります。
response = requests.get(url)
# ステータスコード(成功かどうかの番号)を表示します。
print("ステータスコード:", response.status_code)
# レスポンスの中身(テキスト)を表示します。
print("レスポンス本文:")
print(response.text)
if __name__ == "__main__":
basic_get()
Pythonここで押さえておきたいポイントは3つです。
requests.get(url)が「GETでください」とサーバーにお願いしていること。response.status_codeが「うまくいったかどうか」を教えてくれる番号であること。response.textにサーバーからの返事(本文)がそのまま入っていること。
「ブラウザでURLを開く」のを、Pythonでやっているイメージですね。
パラメータ付きGET:URLに「条件」をつけてアクセスする
クエリパラメータは「ちょっとした注文票」
APIを使うときによく出てくるのが、クエリパラメータ です。
例えばこんなURL:
https://example.com/api/users?page=2&limit=50
これは、
page=2→ 2ページ目をくださいlimit=50→ 1ページあたり50件ください
という「注文票」をURLにくっつけているイメージです。
requestsでパラメータを付ける書き方
# day47_requests_get_params.py
import requests
def get_with_params():
"""クエリパラメータ付きのGETリクエストの例です。"""
url = "https://httpbin.org/get"
# クエリパラメータを辞書で用意します。
params = {
"page": 2,
"limit": 50
}
# params= に渡すと、URLに ?page=2&limit=50 のように付けてくれます。
response = requests.get(url, params=params)
print("実際にアクセスしたURL:", response.url) # 展開されたURLを確認できます。
print("ステータスコード:", response.status_code)
print("レスポンス本文:")
print(response.text)
if __name__ == "__main__":
get_with_params()
Python重要ポイント:
params=に辞書を渡すと、requestsが自動的にURLを組み立ててくれます。response.urlを見ると、「最終的にどんなURLでアクセスしたか」が分かります。- 自分で文字列連結して
"?page=" + str(page)などと書くより、ずっと安全で楽です。
ヘッダー付きGET:ちょっとした「名刺」や「メモ」を添える
ヘッダーは「付箋メモ」のようなもの
HTTPヘッダーは、リクエストやレスポンスにくっついている 追加情報 です。
- 「このデータはJSONだよ」
- 「このブラウザからアクセスしているよ」
- 「認証トークンはこれだよ」
といったメモを、リクエストに貼り付けるイメージです。
requestsでヘッダーを付ける書き方
# day47_requests_headers.py
import requests
def get_with_headers():
"""ヘッダー付きのGETリクエストの例です。"""
url = "https://httpbin.org/headers"
# 送りたいヘッダー情報を辞書で用意します。
headers = {
"User-Agent": "Python-Requests-Example/1.0", # 自分の「名乗り」のようなものです。
"X-Custom-Token": "abc123" # 独自のトークンなどもここに載せられます。
}
# ヘッダーを付けてGETリクエストを送ります。
response = requests.get(url, headers=headers)
print("ステータスコード:", response.status_code)
print("レスポンス本文:")
print(response.text)
if __name__ == "__main__":
get_with_headers()
Pythonポイント:
headers=に辞書を渡すだけで、ヘッダーを自由に付けられます。- 認証が必要なAPIでは、ここに「APIキー」や「Bearerトークン」などを入れることが多いです。
- 「ヘッダー=付箋メモ」と覚えておくと、イメージしやすくなります。
JSONを扱う:APIの「標準語」をそのままPythonで読む
JSONは「軽いデータの箱」
APIの世界では、JSON がほぼ標準のデータ形式になっています。
ざっくり言うと、
- 辞書(キーと値のセット)
- リスト(配列)
を組み合わせたような構造で、 Pythonの dict や list と相性がとても良いのが特徴です。
GETでJSONを受け取る → Pythonの辞書として扱う
# day47_requests_json_get.py
import requests
def get_json_example():
"""JSONレスポンスを受け取って、Pythonの辞書として扱う例です。"""
url = "https://httpbin.org/json"
response = requests.get(url)
print("ステータスコード:", response.status_code)
# レスポンスをJSONとして解釈します。
data = response.json() # ここがポイント。JSON → Pythonのdict/listに変換してくれます。
print("Pythonの型:", type(data))
print("中身:")
print(data)
# 例えば、特定のキーを取り出すこともできます。
if "slideshow" in data:
slideshow = data["slideshow"]
print("タイトル:", slideshow.get("title"))
if __name__ == "__main__":
get_json_example()
Python重要ポイント:
response.json()が、JSON文字列をPythonの辞書・リストに変換してくれる便利メソッドです。- これを使うことで、「APIから受け取ったデータ」をそのままPythonのオブジェクトとして扱えます。
パラメータ+ヘッダー+JSONをまとめて使うミニ例
# day47_requests_all_in_one.py
import requests
def search_example():
"""パラメータ・ヘッダー・JSONをまとめて使う例です。"""
url = "https://httpbin.org/get"
# クエリパラメータ(検索条件のようなもの)
params = {
"q": "python",
"page": 1
}
# ヘッダー(認証やUser-Agentなど)
headers = {
"User-Agent": "Python-Requests-Example/1.0"
}
# GETリクエストを送ります。
response = requests.get(url, params=params, headers=headers)
print("ステータスコード:", response.status_code)
# JSONとして受け取って中身を確認します。
data = response.json()
print("JSONの中身(辞書):")
print(data)
# 例えば、送ったパラメータがどう見えているかを確認できます。
print("送信されたクエリパラメータ:")
print(data.get("args")) # httpbin.org は受け取った情報をそのまま返してくれる便利サイトです。
if __name__ == "__main__":
search_example()
Pythonこのコードは、
params=でクエリパラメータを付けるheaders=でヘッダーを付けるresponse.json()でJSONを辞書として扱う
という、Day 47の要素を一通りまとめて体験できるミニツールになっています。
Day 47ミニテンプレート:API入門用の「GET専用クライアント」
最後に、Day 47の内容をギュッとまとめた、 「GET専用の小さなAPIクライアント」テンプレート を紹介します。
# day47_requests_client_template.py
import requests
def get_api(
url: str,
params: dict | None = None,
headers: dict | None = None,
) -> dict | None:
"""
シンプルなAPIクライアント関数です。
- URLにGETでアクセスします。
- 必要に応じてクエリパラメータやヘッダーを付けます。
- 成功したらJSONを辞書として返します。
"""
print(f"[GET] {url} にアクセスします。")
# GETリクエストを送ります。
response = requests.get(url, params=params, headers=headers)
print("ステータスコード:", response.status_code)
# 成功(200番台)のときだけJSONを返します。
if 200 <= response.status_code < 300:
try:
data = response.json()
print("JSONを受け取りました。")
return data
except ValueError:
print("JSONとして解釈できませんでした。レスポンス本文:")
print(response.text)
return None
else:
print("成功しませんでした。レスポンス本文:")
print(response.text)
return None
def main():
# クエリパラメータとヘッダーを付けてGETする例
url = "https://httpbin.org/get"
params = {"q": "python", "page": 1}
headers = {"User-Agent": "Python-Requests-Client/1.0"}
data = get_api(url, params=params, headers=headers)
if data is not None:
print("取得したデータ:")
print(data)
if __name__ == "__main__":
main()
Pythonこのテンプレートは、
- 「URL・パラメータ・ヘッダーを渡すと、JSONを返してくれる関数」
- 「ステータスコードをチェックして、成功したときだけJSONを扱う」
という、API入門にちょうどいい形になっています。
Day 47のまとめ
Day 47では、requestsを使ったHTTP・API入門として、
requestsは「PythonでHTTPをやさしく扱うための定番ライブラリ」であることrequests.get(url)で、ブラウザのように「ページやデータを取りに行ける」ことparams=に辞書を渡すことで、クエリパラメータ(注文票)を安全に付けられることheaders=に辞書を渡すことで、User-Agentや認証トークンなどの「付箋メモ」をリクエストに添えられることresponse.json()を使うと、JSONレスポンスをそのままPythonの辞書・リストとして扱えること
を整理しました。
ここから先は、
- 外部の公開API(天気予報・為替レート・ニュースなど)
- 社内システムのAPI
- 自分で作る簡単なAPIサーバー
などと組み合わせて、 「PythonからWeb・APIを自在に使いこなす」 世界へ進んでいくことができます。
