この記事では、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 AppID | 2246340 |
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 pandasappdetailsで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 | 表示言語の影響を受ける場合があります |
| アプリ種別 | type | game、dlc、demo など |
| 無料/有料 | is_free | 無料タイトルなら True |
| 価格 | price_overview | 有料タイトルのみ存在する場合があります |
| 発売日 | release_date | date と coming_soon |
| 対応OS | platforms | Windows、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 では、genres と categories の両方が返ることがあります。どちらも分類情報ですが、意味合いが少し異なります。
| 項目 | 例 | 見方 |
|---|---|---|
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("ゲーム本体ではない可能性があります。")type が game であれば、基本的にはゲーム本体として扱えます。dlc や music、demo などの場合は、分析対象として適切か確認してください。
また、DLC側のデータには fullgame が含まれる場合があります。対象が本体か追加コンテンツか迷う場合は、タイトル名、type、fullgame、ストアURLを合わせて確認します。
地域と言語を固定する
appdetails は、cc と l によって返る内容が変わる場合があります。比較分析では、取得条件を固定することが重要です。
# 日本向け・日本語
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_freeとprice_overviewの両方を確認します。 - 地域と言語で値が変わる場合がある
比較分析ではccとlを固定します。 - DLCやサウンドトラックもAppIDを持つ
typeを確認し、対象がゲーム本体かどうかを見ます。 - 短時間に大量リクエストしない
複数タイトルを取得する場合は、適度に間隔を空けます。
レビュー分析での活用例
appdetails で取得したストア情報は、Steamレビュー分析の前提情報として使えます。
| 取得情報 | レビュー分析での使い方 |
|---|---|
| 価格・割引 | 価格改定やセール時期とレビュー増加を比較する |
| 発売日 | 発売直後、アップデート後、長期運用後の評価変化を見る |
| 対応OS | PC環境や動作不満の背景を考える |
| ジャンル | 同ジャンル内で評価されやすい要素を比較する |
| カテゴリ | マルチプレイ、Steam実績、コントローラ対応などの前提情報に使う |
| ヘッダー画像 | 記事カードや一覧ページの補助情報に使う |
たとえば、低評価レビューで「重い」「クラッシュ」「最適化」などの話題が多い場合、対応OSや発売時期、アップデート情報と合わせて確認すると、考察しやすくなります。
次に読む記事
- Steam appreviewsの使い方|レビュー本文・評価サマリーをPythonで取得
- Steam同時接続数を自前収集して可視化する方法|CCUをPythonで定期取得
- SteamSpyの使い方|推定オーナー数・タグ・CCU指標をPythonで取得
- Steam公式Web APIの使い方|アプリ一覧・同時接続・実績・ニュースをPythonで取得
- SteamのAppIDを確認する方法|URL・検索・API・Python一括取得
- Steamの情報を取得する方法まとめ|公式API・Storefront・SteamSpyの使い分け
まとめ
この記事では、Steam Storefrontの appdetails を使って、価格、割引、発売日、対応OS、ジャンル、カテゴリ、画像URLなどのストア情報を取得する方法を紹介しました。
appdetails を使うと、レビュー分析記事に必要なアプリ概要をPythonで整えやすくなります。一方で、公式Web APIとして細かく保証された仕様ではないため、欠損処理、例外処理、地域・言語条件の固定が重要です。
次は、Steamの appreviews を使って、レビュー本文や評価サマリーを取得していきます。