Steam データ活用

Steam appdetailsの使い方|価格・発売日・対応OS・ジャンルをPythonで取得

2025年10月17日

この記事では、Steam Storefrontの appdetails を使って、ゲームの価格、割引、発売日、対応OS、ジャンル、カテゴリ、画像URLなどのストア情報をPythonで取得する方法を解説します。

Steamレビュー分析では、レビュー本文や評価スコアだけでなく、対象タイトルの基本情報も重要です。たとえば、価格、無料/有料、発売日、対応OS、ジャンル、カテゴリを整理しておくと、レビュー傾向を読み解くときの前提情報として使いやすくなります。

本記事では、1タイトルの取得から複数タイトルの一括取得、DataFrame化、CSV保存、記事カード用のデータ整形までを扱います。

この記事でできること

  • Steam Storefrontの appdetails で取得できる情報を理解する
  • AppIDを指定してストア情報を取得する
  • 価格、割引、発売日、対応OS、ジャンル、カテゴリを取り出す
  • DLCやサウンドトラックを誤って対象にしないために type を確認する
  • 複数タイトルのストア情報を一括取得してCSV保存する
  • レビュー分析記事やカード表示に使いやすい形へ整形する
  • appdetails を使うときの注意点を理解する

想定読者

  • Steamゲームの価格や発売日をPythonで取得したい方
  • Steamレビュー分析の前提情報を整えたい方
  • 複数タイトルのストア情報を一覧化したい方
  • Steamの対応OSやジャンル情報をデータ化したい方
  • レビュー分析記事や比較表に使う基本情報を取得したい方

appdetailsとは

appdetails は、Steamストア上のアプリ詳細情報をJSON形式で取得できるエンドポイントです。AppIDを指定すると、タイトル名、価格、発売日、対応OS、ジャンル、カテゴリ、画像URLなどを取得できます。

https://store.steampowered.com/api/appdetails?appids=2246340&cc=jp&l=japanese

主なパラメータは以下です。

パラメータ意味
appids取得対象のSteam AppID2246340
cc国・地域コードjp
l表示言語japanese

cc=jp を指定すると、日本向けの価格表示になりやすくなります。l=japanese を指定すると、タイトルや説明、ジャンル名などが日本語寄りになります。

ただし、appdetails はSteam公式Web APIドキュメントで細かく保証されているエンドポイントではありません。仕様変更や取得失敗の可能性があるため、実装では例外処理や欠損処理を入れて使うのがおすすめです。

事前準備

この記事では、SteamのAppIDが分かっている前提で進めます。AppIDの確認方法は以下の記事で解説しています。

SteamのAppIDを確認する方法|URL・検索・API・Python一括取得

また、Steam公式Web APIの基本的な使い方は以下の記事で扱っています。

Steam公式Web APIの使い方|アプリ一覧・同時接続・実績・ニュースをPythonで取得

使用ライブラリ

HTTPリクエストには requests、表形式の整形には pandas を使います。

pip install -U requests pandas

appdetailsで1タイトルの情報を取得する

まずは、AppIDを1つ指定して appdetails を取得します。ここでは例として、AppID 2246340 を使います。

import requests


def get_appdetails(
    appid: int,
    cc: str = "jp",
    lang: str = "japanese",
) -> dict:
    """
    Steam Storefront appdetails からアプリ詳細を取得する。
    success=False の場合は空dictを返す。
    """
    url = "https://store.steampowered.com/api/appdetails"

    params = {
        "appids": appid,
        "cc": cc,
        "l": lang,
    }

    response = requests.get(
        url,
        params=params,
        timeout=30,
    )

    response.raise_for_status()

    data = response.json()
    node = data.get(str(appid), {})

    if not node.get("success"):
        return {}

    return node.get("data", {})


appid = 2246340

detail = get_appdetails(appid)

print(detail.keys())

取得できた場合、タイトル名、価格、発売日、ジャンル、カテゴリ、画像URLなどを含む辞書が返ります。取得に失敗した場合は空の辞書を返すようにしています。

よく使うフィールド

appdetails でよく使うフィールドは以下です。

取得したい情報主なフィールド補足
タイトル名name表示言語の影響を受ける場合があります
アプリ種別typegamedlcdemo など
無料/有料is_free無料タイトルなら True
価格price_overview有料タイトルのみ存在する場合があります
発売日release_datedatecoming_soon
対応OSplatformsWindows、Mac、Linux の真偽値
ジャンルgenresアクション、RPGなど
カテゴリcategoriesシングルプレイヤー、Steam実績など
ヘッダー画像header_image記事カードや確認用に使いやすいURL
スクリーンショットscreenshots複数画像のURL
おすすめ件数recommendations存在しない場合もあります
メタスコアmetacritic存在しない場合もあります

すべてのタイトルで全フィールドが返るわけではありません。無料タイトルでは価格情報が空になったり、メタスコアやおすすめ件数が存在しなかったりする場合があります。

必要な項目だけを取り出す

取得したJSONをそのまま使うと扱いづらいため、分析や記事で使いやすい項目だけを取り出します。

def extract_appdetails_fields(
    appid: int,
    detail: dict,
) -> dict:
    """
    appdetailsのレスポンスから主要項目を取り出す。
    """
    if not detail:
        return {
            "appid": appid,
            "success": False,
        }

    price = detail.get("price_overview") or {}
    release = detail.get("release_date") or {}
    platforms = detail.get("platforms") or {}

    genres = [
        item.get("description")
        for item in detail.get("genres", [])
        if item.get("description")
    ]

    categories = [
        item.get("description")
        for item in detail.get("categories", [])
        if item.get("description")
    ]

    screenshots = [
        item.get("path_full")
        for item in detail.get("screenshots", [])
        if item.get("path_full")
    ]

    return {
        "appid": appid,
        "success": True,
        "name": detail.get("name"),
        "type": detail.get("type"),
        "is_free": detail.get("is_free"),
        "currency": price.get("currency"),
        "initial_price": price.get("initial"),
        "final_price": price.get("final"),
        "discount_percent": price.get("discount_percent"),
        "final_formatted": price.get("final_formatted"),
        "release_date": release.get("date"),
        "coming_soon": release.get("coming_soon"),
        "windows": platforms.get("windows"),
        "mac": platforms.get("mac"),
        "linux": platforms.get("linux"),
        "genres": genres,
        "categories": categories,
        "header_image": detail.get("header_image"),
        "screenshot_count": len(screenshots),
        "first_screenshot": screenshots[0] if screenshots else None,
        "metacritic_score": (detail.get("metacritic") or {}).get("score"),
        "recommendations_total": (detail.get("recommendations") or {}).get("total"),
    }


appid = 2246340

detail = get_appdetails(appid)
row = extract_appdetails_fields(appid, detail)

print(row)

価格は、Steam側では最小通貨単位の整数で返る場合があります。日本円であれば 899000 のように返ることがあり、表示用には final_formatted を使うと扱いやすいです。

取得結果の表示例

取得結果は環境や時期によって変わりますが、以下のような辞書として整理できます。

{
    "appid": 2246340,
    "success": True,
    "name": "モンスターハンターワイルズ",
    "type": "game",
    "is_free": False,
    "currency": "JPY",
    "final_formatted": "¥ 8,990",
    "release_date": "2025年2月27日",
    "coming_soon": False,
    "windows": True,
    "mac": False,
    "linux": False,
    "genres": ["アクション", "アドベンチャー", "RPG"],
    "categories": ["シングルプレイヤー", "マルチプレイヤー", "Steam実績"]
}

レビュー分析記事では、このような基本情報を冒頭のアプリ概要として使うと、読者が対象タイトルを把握しやすくなります。

複数タイトルを一括取得する

比較記事や一覧ページを作る場合は、複数のAppIDをまとめて取得すると便利です。

import time
import pandas as pd


def fetch_appdetails_many(
    appids: list[int],
    cc: str = "jp",
    lang: str = "japanese",
    sleep_sec: float = 0.5,
) -> pd.DataFrame:
    """
    複数AppIDのappdetailsを取得してDataFrameにする。
    """
    rows = []

    for appid in appids:
        try:
            detail = get_appdetails(
                appid=appid,
                cc=cc,
                lang=lang,
            )

            row = extract_appdetails_fields(
                appid=appid,
                detail=detail,
            )

            rows.append(row)

        except Exception as e:
            rows.append({
                "appid": appid,
                "success": False,
                "error": str(e),
            })

        time.sleep(sleep_sec)

    return pd.DataFrame(rows)


appids = [
    2246340,  # Monster Hunter Wilds
    1446780,  # Monster Hunter Rise
    582010,   # Monster Hunter: World
]

df_details = fetch_appdetails_many(appids)

print(df_details[[
    "appid",
    "name",
    "type",
    "final_formatted",
    "release_date",
    "windows",
    "mac",
    "linux",
]])

取得したDataFrameはCSVとして保存できます。

df_details.to_csv(
    "steam_appdetails.csv",
    index=False,
    encoding="utf-8-sig",
)

複数タイトルを取得する場合は、短時間に大量リクエストしないように sleep_sec で間隔を空けています。

ジャンルとカテゴリの違い

appdetails では、genrescategories の両方が返ることがあります。どちらも分類情報ですが、意味合いが少し異なります。

項目見方
genresアクション、RPG、アドベンチャーゲームの大まかなジャンル
categoriesシングルプレイヤー、マルチプレイヤー、Steam実績、Steamクラウド対応機能やプレイ形態に近い分類

Steamストア上のユーザータグを本格的に扱いたい場合は、appdetails だけではなく、SteamSpyなど別ソースのタグ情報を併用する方法もあります。

SteamSpyの使い方|推定オーナー数・タグ・CCU指標をPythonで取得

DLCやサウンドトラックを誤って対象にしない

Steamでは、ゲーム本体だけでなく、DLC、サウンドトラック、体験版、ツールなどにもAppIDがあります。そのため、レビュー分析やゲーム比較を行う場合は、type を確認しておくことが重要です。

def is_game_app(detail: dict) -> bool:
    """
    appdetailsの結果がゲーム本体かを判定する。
    """
    return bool(detail) and detail.get("type") == "game"


detail = get_appdetails(2246340)

if is_game_app(detail):
    print("ゲーム本体です。")
else:
    print("ゲーム本体ではない可能性があります。")

typegame であれば、基本的にはゲーム本体として扱えます。dlcmusicdemo などの場合は、分析対象として適切か確認してください。

また、DLC側のデータには fullgame が含まれる場合があります。対象が本体か追加コンテンツか迷う場合は、タイトル名、typefullgame、ストアURLを合わせて確認します。

地域と言語を固定する

appdetails は、ccl によって返る内容が変わる場合があります。比較分析では、取得条件を固定することが重要です。

# 日本向け・日本語
detail_jp = get_appdetails(
    appid=2246340,
    cc="jp",
    lang="japanese",
)

# 米国向け・英語
detail_us = get_appdetails(
    appid=2246340,
    cc="us",
    lang="english",
)

日本向けの記事や分析では、基本的に cc="jp"lang="japanese" に固定すると扱いやすいです。国や言語を混ぜると、価格、通貨、ジャンル表記、発売日表記が比較しづらくなります。

記事カード用に整形する

取得したストア情報は、記事内の概要カードや一覧ページにも使えます。ここでは、記事カード向けに必要な情報だけを整形します。

def make_store_card(
    appid: int,
    detail: dict,
) -> dict:
    """
    記事カード用に最低限の情報を整形する。
    """
    row = extract_appdetails_fields(appid, detail)

    genres = row.get("genres") or []
    categories = row.get("categories") or []

    price_display = row.get("final_formatted")

    if row.get("is_free"):
        price_display = "無料"

    return {
        "appid": appid,
        "title": row.get("name"),
        "type": row.get("type"),
        "price": price_display,
        "release_date": row.get("release_date"),
        "genres": " / ".join(genres[:3]),
        "categories": " / ".join(categories[:3]),
        "platforms": ", ".join([
            name for name, flag in {
                "Windows": row.get("windows"),
                "Mac": row.get("mac"),
                "Linux": row.get("linux"),
            }.items()
            if flag
        ]),
        "header_image": row.get("header_image"),
    }


appid = 2246340

detail = get_appdetails(appid)
card = make_store_card(appid, detail)

print(card)

このような辞書にしておくと、WordPress記事用の表、内部カード、比較表、JSON出力などに流用しやすくなります。

取得結果を見るときの注意点

appdetails を使うときは、以下の点に注意してください。

  • 公式Web APIとして細かく保証された仕様ではない
    将来、レスポンス形式や取得可否が変わる可能性があります。
  • すべてのフィールドが必ず返るわけではない
    価格、メタスコア、おすすめ件数、画像などは欠損する場合があります。
  • 無料タイトルでは価格情報が空になる場合がある
    is_freeprice_overview の両方を確認します。
  • 地域と言語で値が変わる場合がある
    比較分析では ccl を固定します。
  • DLCやサウンドトラックもAppIDを持つ
    type を確認し、対象がゲーム本体かどうかを見ます。
  • 短時間に大量リクエストしない
    複数タイトルを取得する場合は、適度に間隔を空けます。

レビュー分析での活用例

appdetails で取得したストア情報は、Steamレビュー分析の前提情報として使えます。

取得情報レビュー分析での使い方
価格・割引価格改定やセール時期とレビュー増加を比較する
発売日発売直後、アップデート後、長期運用後の評価変化を見る
対応OSPC環境や動作不満の背景を考える
ジャンル同ジャンル内で評価されやすい要素を比較する
カテゴリマルチプレイ、Steam実績、コントローラ対応などの前提情報に使う
ヘッダー画像記事カードや一覧ページの補助情報に使う

たとえば、低評価レビューで「重い」「クラッシュ」「最適化」などの話題が多い場合、対応OSや発売時期、アップデート情報と合わせて確認すると、考察しやすくなります。

次に読む記事

まとめ

この記事では、Steam Storefrontの appdetails を使って、価格、割引、発売日、対応OS、ジャンル、カテゴリ、画像URLなどのストア情報を取得する方法を紹介しました。

appdetails を使うと、レビュー分析記事に必要なアプリ概要をPythonで整えやすくなります。一方で、公式Web APIとして細かく保証された仕様ではないため、欠損処理、例外処理、地域・言語条件の固定が重要です。

次は、Steamの appreviews を使って、レビュー本文や評価サマリーを取得していきます。

-Steam, データ活用