この記事では、Steam Storefront APIの appdetails を使い、価格、発売日、対応OS、ジャンル、開発元、パブリッシャーなどのストア情報をPythonで取得する方法をまとめます。
appdetailsで取得できる情報
- ゲーム名
- 価格、割引率、通貨
- 発売日
- 対応OS
- ジャンル、カテゴリ
- 開発元、パブリッシャー
- スクリーンショットやヘッダー画像URL
Steam公式Web APIというより、Steamストアページ側の公開情報を取得するためのエンドポイントとして扱います。仕様変更の影響を受ける可能性があるため、分析用には取得日を残します。
基本コード
import requests
appid = 2246340
url = "https://store.steampowered.com/api/appdetails"
params = {
"appids": appid,
"cc": "jp",
"l": "japanese",
}
response = requests.get(url, params=params, timeout=30)
response.raise_for_status()
data = response.json()[str(appid)]
if not data["success"]:
raise RuntimeError("appdetailsの取得に失敗しました")
details = data["data"]
print(details["name"])必要な項目だけ取り出す
def normalize_appdetails(appid: int, details: dict) -> dict:
price = details.get("price_overview") or {}
platforms = details.get("platforms") or {}
return {
"appid": appid,
"name": details.get("name"),
"type": details.get("type"),
"is_free": details.get("is_free"),
"release_date": (details.get("release_date") or {}).get("date"),
"coming_soon": (details.get("release_date") or {}).get("coming_soon"),
"currency": price.get("currency"),
"initial": price.get("initial"),
"final": price.get("final"),
"discount_percent": price.get("discount_percent"),
"windows": platforms.get("windows"),
"mac": platforms.get("mac"),
"linux": platforms.get("linux"),
"developers": ", ".join(details.get("developers") or []),
"publishers": ", ".join(details.get("publishers") or []),
"genres": ", ".join(g["description"] for g in details.get("genres", [])),
}このコードのinitial・finalはAPI応答の数値を変換せず保存します。数値をそのまま円と読まず、同じ応答のcurrencyとinitial_formatted・final_formattedを照合してください。価格情報がない場合は金額を推測しません。
複数AppIDをCSV保存する
python -m pip install requests を実行してください。単発取得例とは別に、上の正規化関数とこのコードを同じPythonファイルへ順に保存して実行します。HTTPエラー等は対象IDを記録して次へ進み、成功分を保存します。空リスト・全件失敗でも列名を保存します。同名CSVは上書きするため、過去の取得結果は別名で保管してください。
import csv
from pathlib import Path
from time import sleep
from datetime import datetime, timezone
import requests
appids = [730, 578080, 2246340]
rows = []
failed = []
fields = list(normalize_appdetails(0, {})) + ["fetched_at_utc", "request_conditions"]
for appid in appids:
params = {"appids": appid, "cc": "jp", "l": "japanese"}
try:
response = requests.get("https://store.steampowered.com/api/appdetails", params=params, timeout=30)
response.raise_for_status()
result = response.json().get(str(appid), {})
if not result.get("success") or not isinstance(result.get("data"), dict):
raise ValueError("success=false または data 欠損")
row = normalize_appdetails(appid, result["data"])
row.update(fetched_at_utc=datetime.now(timezone.utc).isoformat(), request_conditions="cc=jp;l=japanese")
rows.append(row)
except (requests.RequestException, ValueError, TypeError) as exc:
failed.append({"appid": appid, "reason": type(exc).__name__})
sleep(1)
csv_path = Path("outputs/steam_appdetails.csv")
csv_path.parent.mkdir(parents=True, exist_ok=True)
with csv_path.open("w", encoding="utf-8-sig", newline="") as f:
writer = csv.DictWriter(f, fieldnames=fields)
writer.writeheader()
writer.writerows(rows)
failure_path = csv_path.with_name(csv_path.stem + "_failures.csv")
with failure_path.open("w", encoding="utf-8-sig", newline="") as f:
writer = csv.DictWriter(f, fieldnames=["appid", "reason"])
writer.writeheader()
writer.writerows(failed)
print("成功ID:", [row["appid"] for row in rows])
print("失敗ID:", [row["appid"] for row in failed])
print("保存先:", csv_path.resolve(), "件数:", len(rows))
if not rows:
print("取得結果は0件です。列名のみ保存しました。対象IDと失敗一覧を確認してください。")
保存結果を別の実行で確認する
保存時と同じ作業フォルダーから、次のコードを新しいPython実行で動かします。0件は取得失敗と未対象を失敗一覧で区別し、傾向を集計しません。
import csv
from pathlib import Path
path = Path("outputs/steam_appdetails.csv")
with path.open(encoding="utf-8-sig", newline="") as f:
reader = csv.DictReader(f)
print("列:", reader.fieldnames)
saved_rows = list(reader)
print("再読込件数:", len(saved_rows))分析時の注意
- 価格や割引は取得時点の値として保存する
- 地域指定
ccにより価格や表示が変わる - 発売日前タイトルや非公開タイトルでは項目が欠けることがある
- DLCやデモもAppIDを持つため、本編と区別する
まとめ
appdetails は、Steamストアページに近い情報を取得するのに便利です。価格、発売日、対応OS、ジャンルなどをまとめてCSV化しておくと、ゲーム比較やジャンル別の傾向確認に使いやすくなります。