基礎から学ぶPython入門 90日コース | Web・API - Day 47:requests

Python 90日で身につけるPython
スポンサーリンク
スポンサーリンク

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の dictlist と相性がとても良いのが特徴です。

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を自在に使いこなす」 世界へ進んでいくことができます。

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