Steamデータ取得 データ取得

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

2025年10月17日

この記事では、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化しておくと、ゲーム比較やジャンル別の傾向確認に使いやすくなります。

-Steamデータ取得, データ取得