◀ 20.

PythonのResponseオブジェクトの中身の確認

▶

Python Requests の Response は、受信した HTTP 状態・ヘッダー・本文を別々に調べるためのオブジェクトです。文字列表示、JSON解析、HTTP成功判定は同じ操作ではありません。

ResponseをHTTP状態・本文の解釈・消費と記録に分けて確認する図

この記事の要点
  • Python requests ライブラリの Response オブジェクトの中身を確認する方法
  • 文字列: response.text / バイナリ: response.content / JSON: response.json()
  • ステータスコード: response.status_code
  • ヘッダ: response.headers / Cookie: response.cookies

 

レスポンス取得例

以下は元の最小例です。url は許可された取得先を別途設定する変数で、単独では実行できません。timeout 未指定では無期限に待つ場合があります。実用時は requests.get(url, timeout=(3, 10)) のように接続・読取の待ち時間を指定します。この値は本文全体の総時間制限ではありません。取得処理や再試行の設計はHTTPリクエストの方法で確認してください。

response = requests.get(url)

 

レスポンスを文字列で取得

res_str = response.text

 

レスポンスをJSONで取得

先に status_code と必要な成功条件を確認します。json() は HTTP エラーでも解析できる一方、204や不正JSONでは requests.exceptions.JSONDecodeError が発生します。空本文を勝手に空の辞書へ置換しません。

res_json = response.json()

JSONオブジェクトなら dict、配列なら list、数値なら int / float、真偽値なら bool、null なら None になります。dict 固定ではないので、キーを参照する前に期待した形か確認します。

text・content・encoding の違い

確認する値用途と注意
response.content本文の bytes。画像等のバイナリにも使う。gzip等は通常展開済みで、通信時の生バイトそのものではない。
response.text本文を復号した str。encoding の影響を受ける。表示できても正しい文字コードとは限らない。
response.encodingヘッダー等から決まる文字コード。仕様や別の確実な根拠があるときだけ変更し、その後で text を読む。
response.apparent_encoding検出器による推定。正解の保証ではなく、参照時に本文の読込みも起こり得る。

例えばヘッダーが誤っていて、実体が UTF-8 と分かっている検体なら response.encoding = "utf-8" の後に response.text を読み直します。すべての文字化けに UTF-8 を強制する対処ではありません。厳密な復号エラーを検出したい場合は、既知の文字コードで response.content.decode("utf-8", errors="strict") を使い、UnicodeDecodeError を扱います。text は通常、復号できない箇所を置換して返すため、データ完全性の検査にはなりません。

status_code・ok・raise_for_status を分ける

status_code は整数です。raise_for_status() は 4xx / 5xx に HTTPError を投げますが、302や304を失敗とは扱いません。ok と bool(response) も「200のみ」や「2xxのみ」ではありません。404の Response も受信済みオブジェクトなので、存在判定なら response is not None と明示します。成功条件を 200 や 2xx に限定するかは相手APIの契約に合わせます。

200でもHTMLのエラーページが届く場合があり、500でも正しいJSONが届きます。json() の成功だけで業務成功と判断しません。Content-Type は response.headers.get("Content-Type") で確認でき、未指定なら None です。JSONの宣言があることと、内容・型が正しいことも別です。汎用の応答検証やサイズ上限処理はHTTP取得側の記事を参照してください。

headers・cookies・url・history の読み方

headers は大文字小文字を区別しない辞書風オブジェクトです。headers["Content-Type"] は欠落すると KeyError、get() は既定値を指定できます。重複ヘッダーは結合される場合があるため、生のヘッダー一覧や値の単純なカンマ分割と同一視しません。特に Set-Cookie は Expires 内にもカンマを含みます。

response.cookies はその応答で設定されたCookieのjarで、Session全体の蓄積とは別です。同じ名前でも domain / path が異なるCookieがあり、辞書化で情報を失う場合があります。Cookieの送信・保存・選択はCookieの設定と取得で確認します。GETでリダイレクトを許した場合、url は最終URL、history は古い順の途中の Response です。追従しなければ302自体を確認でき、履歴は空になります。HEADは既定の追従動作が異なります。

elapsed は本文全体の所要時間ではない

response.elapsed.total_seconds() はリクエスト送信から応答ヘッダー解析完了までの時間を秒で返します。本文をすべて読む時間は含みません。elapsed.microseconds は1秒未満部分だけなので合計秒には使いません。リダイレクト後の elapsed だけを全行程の時間と扱わず、history の各応答と区別します。読込み・解析を含む経過時間を測るなら対象処理の前後を time.perf_counter() で囲みますが、このページの値は速度改善の実測比較ではありません。

stream=True で読み取るときの消費と解放

通常は取得時に本文も読み込みますが、stream=True では本文を後から消費します。with requests.get(url, stream=True, timeout=(3, 10)) as response: の範囲で iter_content() を読み切るか、途中でやめたら close() します。with は例外時も解放します。stream=True でも先に content / text / json() を参照すると本文全体の読込みが起こり、メモリ節約の狙いを失います。

iter_content() のチャンクは指定サイズと常に同じ長さとは限らず、gzip等の展開も行われます。一度読み切ったストリームを再度同じように読めるとは限りません。raw はより低水準のストリームで、通常の本文処理には iter_content() を使います。下の decoded_size は展開後のバイト数を数える説明例で、サイズ上限や総時間制限の実装ではありません。信頼できない巨大データを無制限に読む用途へ転用しません。

必要な情報だけを記録する例

本文・Cookie・URLを丸ごとログへ出さない。認証ヘッダー、Set-Cookie、URLのクエリ、個人情報は調査時にも秘密値を含み得ます。先頭200文字への切詰めも秘匿化ではありません。HTTPError等の例外文字列にもURLが含まれる場合があるため、そのまま外へ公開しません。

次のファイルは既に取得した Response を受け取り、固定項目だけのメタ情報、既知の文字コードでの表示、ストリームの消費を別関数にします。本文・ヘッダー・URLの内容は出力せず、汎用HTTP取得・再試行は実装しません。

"""Response inspection only; no transport policy, retries, or external calls."""


def metadata(response):
    # Fixed allowlist. No URL, body, cookies, request or arbitrary header values.
    return {
        "status": response.status_code,
        "header_seconds": response.elapsed.total_seconds(),
        "redirect_count": len(response.history),
    }


def read_text(response, encoding=None):
    if encoding is not None:
        response.encoding = encoding  # Only use an independently known charset.
    return response.text


def decoded_size(response):
    # Consumes the stream; does not retain the complete body in this function.
    # Not a download limit or an HTTP policy helper.
    return sum(len(chunk) for chunk in response.iter_content(chunk_size=8192) if chunk)

確認環境と公式資料

2026-10-26、Python 3.12.10 / Requests 2.34.2 / urllib3 2.8.0 の隔離loopback HTTPで、正常・異常・空JSON、文字コード、バイナリ、gzip、ヘッダー、リダイレクト、ストリームと時間の境界を確認しました。外部API・実資格情報・TLS・本番通信の検証ではありません。

子ページ

子ページはありません

同階層のページ
  1. 基本的なルール
  2. 変数
  3. 演算子
  4. 型
  5. 標準ライブラリ
  6. 外部ライブラリ
  7. 制御構文
  8. リスト(配列)
  9. タプル
  10. セット
  11. 辞書(dict)
  12. クラスとメソッド
  13. 継承の概念と必要性
  14. 継承の構文
  15. コンストラクタ
  16. cookieの値の設定と取得
  17. 例外処理
  18. 例外を文字列で出力する方法
  19. httpリクエスト(curl)をする方法
  20. Responseオブジェクトの中身の確認
  21. 変数が空かどうか判定する方法
  22. タイムゾーンの設定と現在日時の取得と文字列化
  23. シングルクォーテーションとダブルクォーテーションの違い

最近更新/作成されたページ