この記事では、SteamSpy APIを使って、推定オーナー数、タグ、プレイ時間、CCU関連指標などをPythonで取得する方法をまとめます。
SteamSpyを使う前提
SteamSpyは、Steamの公開情報などをもとにゲームの所有者数や指標を推定する外部サービスです。公式のSteam販売本数ではありません。分析記事では、数値を断定的に扱わず、推定値・参考値として使います。
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など複数指標と合わせる
関連記事
- Steam appdetailsの使い方|価格・発売日・対応OS・ジャンルをPythonで取得
- Steam appreviewsの使い方|レビュー本文・評価サマリーをPythonで取得
- Steam同時接続数を定期取得して可視化する方法|CCU推移をPythonで保存する
まとめ
SteamSpy APIは、推定オーナー数やタグ、CCUなどをまとめて見る補助データとして便利です。ただし公式な販売本数ではないため、推定値として扱い、レビュー数や同時接続数など他の公開データと合わせて読むのが現実的です。