【Python】Requests入門:Webサイト取得とREST API連携の基本

PythonでWebスクレイピングやREST APIを利用する際、標準ライブラリの urllib よりも圧倒的に扱いやすく、デファクトスタンダードとなっているのがサードパーティ製ライブラリの requests です。

人間にとって読みやすく、直感的な記述でHTTP通信を制御できる点が特徴です。ここでは、基本的なインストール方法から、HTTPメソッドとの対応、そして実用的なAPIデータ取得の実装例について解説します。

目次

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

外部ライブラリのため、pip コマンドを使用してインストールを行います。

pip install requests

HTTPメソッドとRequests関数の対応表

HTTPプロトコルで定義されている主要なメソッドは、requests ライブラリの関数として直感的にマッピングされています。

HTTPメソッドRequestsの関数主な用途
GETrequests.get()サーバーからリソース(データ・HTML)を取得する
POSTrequests.post()サーバーへデータを送信し、リソースを新規作成する
PUTrequests.put()既存のリソースを送信データで完全に置換(更新)する
DELETErequests.delete()指定したリソースを削除する
PATCHrequests.patch()既存のリソースの一部を修正(部分更新)する
HEADrequests.head()レスポンスボディを取得せず、ヘッダー情報のみを取得する

実践コード:REST APIからのデータ取得と例外処理

WebサイトのHTMLを取得するだけでなく、JSON形式のAPIからデータを取得するケースが現代の開発では頻繁にあります。

以下のコードは、テスト用APIサービスに対してGETリクエストを送り、ユーザー情報を取得して表示する完全なスクリプトです。単に取得するだけでなく、実務で必須となる「タイムアウト設定」や「ステータスコードの検証(エラーハンドリング)」を含んでいます。

import requests
from requests.exceptions import RequestException, Timeout

def fetch_latest_posts():
    """
    テスト用APIから記事データを取得し、タイトルを表示する関数
    """
    # テスト用APIのエンドポイント(JSONPlaceholderを使用)
    target_url = "https://jsonplaceholder.typicode.com/posts"
    
    # サーバーに自分がスクリプトであることを伝える(マナーとして推奨)
    headers = {
        "User-Agent": "Python-Requests-Sample/1.0"
    }

    print(f"Requesting: {target_url} ...")

    try:
        # GETリクエストの送信
        # timeout設定は必須(秒単位)。設定しないと応答がない場合に無限に待機してしまうリスクがある
        response = requests.get(target_url, headers=headers, timeout=10)

        # ステータスコードが400系・500系の場合に例外を発生させる
        # これにより、if response.status_code == 200: のような分岐を書く手間が省ける
        response.raise_for_status()

        # レスポンスの形式確認
        # APIの場合はHTML(text)ではなくJSONとしてパースすることが一般的
        print(f"Status Code: {response.status_code}")
        print(f"Encoding: {response.encoding}")
        
        posts = response.json()
        
        # 取得データの表示(最初の3件のみ)
        print("-" * 40)
        for post in posts[:3]:
            print(f"ID: {post['id']}")
            print(f"Title: {post['title']}")
            print("-" * 40)

    except Timeout:
        print("エラー: サーバーからの応答がタイムアウトしました。")
    except RequestException as e:
        # ネットワークエラーや404/500エラーなどをまとめて捕捉
        print(f"通信エラーが発生しました: {e}")

if __name__ == "__main__":
    fetch_latest_posts()

コードの重要なポイント

1. response.textresponse.json()

WebサイトのHTMLを取得したい場合は response.text を使用して文字列として扱いますが、REST APIの結果を取得する場合は response.json() メソッドを使用します。これにより、自動的にPythonの辞書(dict)やリスト(list)に変換され、即座にデータ操作が可能になります。

2. raise_for_status()

通信自体が成功しても、サーバー側で「ページが見つからない(404)」や「サーバーエラー(500)」が発生している場合があります。response.raise_for_status() を呼び出すことで、HTTPステータスコードがエラーを示している場合に例外(HTTPError)を送出させ、正常系と異常系の処理を明確に分けることができます。

3. タイムアウトの設定

requests.get() の引数に timeout=10(秒)などを指定することは、堅牢なアプリケーションを作る上で非常に重要です。ネットワーク障害時にプログラムがフリーズするのを防ぐことができます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次