Steamデータ取得 データ取得

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

2025年10月17日

この記事では、SteamSpy APIを使って、推定オーナー数、タグ、プレイ時間、CCU関連指標などをPythonで取得する方法をまとめます。

SteamSpyを使う前提

SteamSpyは、Steamの公開情報などをもとにゲームの所有者数や指標を推定する外部サービスです。公式のSteam販売本数ではありません。分析記事では、数値を断定的に扱わず、推定値・参考値として使います。

SteamSpy API

1本のゲーム情報を取得する

import requests

appid = 730
url = "https://steamspy.com/api.php"
params = {
    "request": "appdetails",
    "appid": appid,
}

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

data = response.json()
print(data.keys())
print(data.get("name"), data.get("owners"))

必要な項目だけ整理する

def normalize_steamspy(data: dict) -> dict:
    return {
        "appid": data.get("appid"),
        "name": data.get("name"),
        "developer": data.get("developer"),
        "publisher": data.get("publisher"),
        "owners": data.get("owners"),
        "average_forever": data.get("average_forever"),
        "median_forever": data.get("median_forever"),
        "ccu": data.get("ccu"),
        "score_rank": data.get("score_rank"),
        "positive": data.get("positive"),
        "negative": data.get("negative"),
        "tags": data.get("tags"),
    }

複数AppIDをCSV保存する

python -m pip install requests を実行してください。単発取得例とは別に、上の正規化関数とこのコードを同じPythonファイルへ順に保存して実行します。HTTPエラー等は対象IDを記録して次へ進み、成功分を保存します。空リスト・全件失敗でも列名を保存します。同名CSVは上書きするため、過去の取得結果は別名で保管してください。

import csv
import json
from pathlib import Path
from time import sleep
from datetime import datetime, timezone
import requests

appids = [730, 578080, 2246340]
rows = []
failed = []
fields = list(normalize_steamspy({})) + ["fetched_at_utc", "request_conditions"]

for appid in appids:
    params = {"request": "appdetails", "appid": appid}
    try:
        response = requests.get("https://steamspy.com/api.php", params=params, timeout=30)
        response.raise_for_status()
        data = response.json()
        if not isinstance(data, dict) or str(data.get("appid")) != str(appid):
            raise ValueError("対象AppIDの応答がありません")
        row = normalize_steamspy(data)
        row["tags"] = json.dumps(row["tags"], ensure_ascii=False)
        row.update(fetched_at_utc=datetime.now(timezone.utc).isoformat(), request_conditions="request=appdetails")
        rows.append(row)
    except (requests.RequestException, ValueError, TypeError) as exc:
        failed.append({"appid": appid, "reason": type(exc).__name__})
    sleep(1)

csv_path = Path("outputs/steamspy.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と失敗一覧を確認してください。")

タグを扱う

tags はタグ名とスコアの辞書として返ります。ジャンル比較や類似ゲーム探索に使えますが、Steam公式ジャンルとは別のユーザータグとして扱います。

import csv
import json
from pathlib import Path
with Path("outputs/steamspy.csv").open(encoding="utf-8-sig", newline="") as f:
    for row in csv.DictReader(f):
        tags = json.loads(row["tags"]) if row["tags"] else {}
        if not isinstance(tags, dict):
            continue
        print(row["appid"], sorted(tags.items(), key=lambda x: x[1], reverse=True)[:10])

保存結果を別の実行で確認する

保存時と同じ作業フォルダーから、次のコードを新しいPython実行で動かします。0件は取得失敗と未対象を失敗一覧で区別し、傾向を集計しません。

import csv
from pathlib import Path
path = Path("outputs/steamspy.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))

分析時の注意

  • ownersは推定値であり、実売数ではない
  • 低販売本数・新作・無料配布直後のタイトルはぶれやすい
  • Steam公式APIやStorefront APIの値と混同しない
  • 重要な判断には単独で使わず、レビュー数やCCUなど複数指標と合わせる

関連記事

まとめ

SteamSpy APIは、推定オーナー数やタグ、CCUなどをまとめて見る補助データとして便利です。ただし公式な販売本数ではないため、推定値として扱い、レビュー数や同時接続数など他の公開データと合わせて読むのが現実的です。

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