Steamデータ取得 データ取得

Steam appreviewsの使い方|レビュー本文・評価サマリーをPythonで取得

2025年10月17日

この記事では、Steam Store APIの appreviews を使い、Steamレビューの評価サマリーやレビュー本文をPythonで取得する方法をまとめます。

SteamworksのUser Reviewsドキュメントでは、ストアページに表示されるレビュー情報を取得するAPIとして説明されています。レビュー本文はユーザー投稿に近い情報なので、公開記事では全文転載ではなく、集計・要約・傾向分析として扱います。

User Reviews - Get List

評価サマリーを取得する

import requests

appid = 2246340
url = f"https://store.steampowered.com/appreviews/{appid}"
params = {
    "json": 1,
    "language": "japanese",
    "purchase_type": "all",
    "filter": "summary",
}

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

data = response.json()
print(data["query_summary"])

query_summary には、レビュー件数や好評率に関係する情報が入ります。まずは本文取得より先に、サマリーだけ確認すると負荷を抑えられます。

レビュー本文を取得する

params = {
    "json": 1,
    "language": "japanese",
    "purchase_type": "all",
    "filter": "recent",
    "num_per_page": 20,
}

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

data = response.json()

for review in data["reviews"][:3]:
    print(review["voted_up"], review["review"][:100])

カーソルでページングする

appreviews はレスポンス内の cursor を使って次ページを取得します。URLに入れる際はエンコードが必要です。

from urllib.parse import quote

reviews = []
cursor = "*"

for _ in range(5):
    params = {
        "json": 1,
        "language": "japanese",
        "purchase_type": "all",
        "filter": "recent",
        "num_per_page": 100,
        "cursor": cursor,
    }

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

    batch = data.get("reviews", [])
    reviews.extend(batch)

    if not batch:
        break

    cursor = data.get("cursor", cursor)

print(len(reviews))

CSVに保存する

import csv
from pathlib import Path

def normalize_review(review: dict) -> dict:
    author = review.get("author", {})
    return {
        "recommendationid": review.get("recommendationid"),
        "voted_up": review.get("voted_up"),
        "review": review.get("review"),
        "timestamp_created": review.get("timestamp_created"),
        "timestamp_updated": review.get("timestamp_updated"),
        "playtime_forever": author.get("playtime_forever"),
        "playtime_at_review": author.get("playtime_at_review"),
        "language": review.get("language"),
    }

rows = [normalize_review(r) for r in reviews]

csv_path = Path("outputs/steam_reviews.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=rows[0].keys())
    writer.writeheader()
    writer.writerows(rows)

公開記事に使うときの注意

  • レビュー本文を長文転載しない
  • 特定ユーザーを追跡・特定しない
  • 取得条件、言語、取得日、件数を明記する
  • レビューは投稿者の主観であり、ゲーム全体の評価と同一視しない
  • 機械翻訳や要約を使う場合は、誤読の可能性を残す

まとめ

appreviews を使うと、Steamレビューの評価サマリーやレビュー本文を取得できます。分析記事では、本文をそのまま載せるより、評価傾向、投稿時期、プレイ時間、話題の変化として集計する使い方が向いています。

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