Google Play データ活用

Google Playのデータ取得方法まとめ|google-play-scraperでアプリ情報・レビューを取得する

2023年5月9日

この記事では、Pythonライブラリ google-play-scraper を使って、Google Playのアプリ情報やレビューを取得する方法を解説します。

最終的には、アプリの基本情報、レビュー本文、評価スコア、投稿日、アプリバージョン、検索結果、権限情報などを取得し、CSVとして保存できる状態を目指します。Google Playレビュー分析、アプリ比較、可視化、テキスト分析の入口となる記事です。

この記事でできること

  • google-play-scraper の基本的な使い方を理解する
  • アプリIDを指定して、アプリ詳細情報を取得する
  • Google Playレビューを取得してCSV保存する
  • レビュー取得時のページング処理を理解する
  • 検索キーワードからアプリ候補を取得する
  • アプリの権限情報を取得する
  • レビュー分析で注意すべきデータ仕様を理解する

想定読者

  • Google Playのアプリ情報をPythonで取得したい方
  • アプリレビューを収集して、可視化やテキスト分析に使いたい方
  • レビュー分析、感情分析、トピック抽出の前処理を行いたい方
  • Google Play上のゲームアプリや競合アプリをデータで比較したい方

利用上の注意

google-play-scraper はGoogle公式APIではなく、非公式ライブラリです。そのため、Google Play側の仕様変更により、取得できる項目や動作が変わる可能性があります。

  • 短時間に大量アクセスするような使い方は避けてください。
  • 取得したレビュー本文を無断で大量転載・再配布することは避けてください。
  • レビューには個人情報、不適切表現、誹謗中傷が含まれる場合があります。
  • 分析結果を公開する場合は、個別ユーザーの特定につながらないように配慮してください。
  • 取得結果は取得時点のスナップショットであり、Google Play全体の評価を完全に代表するものではありません。

本記事では、公開されている情報を対象に、技術検証・分析前処理として必要な範囲でデータを扱うことを前提にしています。

google-play-scraperで取得できる主な情報

google-play-scraper を使うと、主に以下のような情報を取得できます。

取得対象主な内容使用する関数
アプリ詳細タイトル、説明文、評価、レビュー数、価格、カテゴリ、開発者情報などapp()
レビューレビュー本文、星評価、投稿日、アプリバージョン、参考になった数などreviews()
全件レビュー取得可能なレビューをまとめて取得reviews_all()
権限情報アプリが要求する権限一覧permissions()
検索結果キーワードに一致するアプリ一覧search()

この中でも、レビュー分析でよく使うのは app()reviews() です。まずはアプリ詳細を確認し、その後レビューを取得してCSV化する流れが基本になります。

ライブラリのインストール

まず、必要なライブラリをインストールします。

pip install -U google-play-scraper pandas

レビュー取得時に進捗を表示したい場合は、tqdm もインストールしておくと便利です。

pip install -U tqdm

アプリIDの確認方法

Google Playのアプリを取得するには、アプリIDを指定します。アプリIDは、Google PlayのURLに含まれる id= 以降の文字列です。

たとえば、以下のようなURLの場合、アプリIDは com.miHoYo.GenshinImpact です。

https://play.google.com/store/apps/details?id=com.miHoYo.GenshinImpact

Pythonコードでは、このアプリIDを指定して情報を取得します。

アプリ詳細を取得する

まずは、単一アプリの詳細情報を取得します。タイトル、説明文、評価、レビュー数、インストール数、カテゴリ、開発者情報などを確認できます。

from google_play_scraper import app
import pandas as pd

app_id = "com.miHoYo.GenshinImpact"

detail = app(
    app_id,
    lang="ja",
    country="jp",
)

df = pd.json_normalize(detail)

cols = [
    "appId",
    "title",
    "summary",
    "score",
    "ratings",
    "reviews",
    "installs",
    "minInstalls",
    "free",
    "price",
    "currency",
    "genre",
    "genreId",
    "developer",
    "developerId",
    "developerWebsite",
]

cols = [c for c in cols if c in df.columns]

print(df[cols].T)

アプリ詳細は、レビュー分析の前提情報として使えます。たとえば、レビュー分析記事の「アプリ概要」や、競合アプリの比較表を作るときに便利です。

アプリ詳細をCSV保存する

取得したアプリ詳細をCSV保存する例です。

from pathlib import Path

output_dir = Path("googleplay_data")
output_dir.mkdir(parents=True, exist_ok=True)

csv_path = output_dir / f"{app_id}_detail.csv"
df.to_csv(csv_path, index=False, encoding="utf-8-sig")

print(f"saved: {csv_path}")

CSVとして保存しておくと、複数アプリの比較や、後続の可視化処理に使いやすくなります。

レビューを最初の100件だけ取得する

次に、アプリレビューを取得します。まずは動作確認として、最新レビューを最大100件だけ取得する例です。

from pathlib import Path

import pandas as pd
from google_play_scraper import Sort, reviews

app_id = "com.miHoYo.GenshinImpact"

review_data, continuation_token = reviews(
    app_id,
    lang="ja",
    country="jp",
    sort=Sort.NEWEST,
    count=100,
)

df_reviews = pd.DataFrame(review_data)

output_dir = Path("googleplay_data")
output_dir.mkdir(parents=True, exist_ok=True)

csv_path = output_dir / f"{app_id}_reviews_first100.csv"
df_reviews.to_csv(csv_path, index=False, encoding="utf-8-sig")

print(f"saved: {csv_path}")
print("rows:", len(df_reviews))
print(df_reviews.head())

sort には、取得順を指定できます。たとえば、Sort.NEWEST は新しいレビュー順、Sort.RATING は評価順、Sort.HELPFULNESS は参考になった順として使えます。

まずは100件程度で動作確認し、取得できる列やレビュー本文の形式を確認してから、取得件数を増やすのがおすすめです。

レビューで取得できる主な列

レビュー取得結果には、以下のような列が含まれます。

列名内容
reviewIdレビューID
userName投稿者名
contentレビュー本文
score星評価
thumbsUpCount参考になった数
reviewCreatedVersionレビュー投稿時のアプリバージョン
at投稿日
replyContent開発者返信の本文
repliedAt開発者返信日時

後続の分析では、contentscoreatreviewCreatedVersion を使うことが多いです。

ページングしながらレビューを取得する

より多くのレビューを取得したい場合は、continuation_token を使ってページングします。以下は、最大ページ数や最大件数を指定できる実用コードです。

from pathlib import Path
import time

import pandas as pd
from google_play_scraper import Sort, reviews


def fetch_reviews_paged(
    app_id: str,
    lang: str = "ja",
    country: str = "jp",
    sort: Sort = Sort.NEWEST,
    count_per_page: int = 100,
    max_pages: int | None = 10,
    pause_sec: float = 1.0,
) -> pd.DataFrame:
    rows = []
    seen_review_ids = set()
    continuation_token = None

    for page in range(1, (max_pages or 10**9) + 1):
        review_data, continuation_token = reviews(
            app_id,
            lang=lang,
            country=country,
            sort=sort,
            count=count_per_page,
            continuation_token=continuation_token,
        )

        new_rows = []

        for row in review_data:
            review_id = row.get("reviewId")
            if review_id and review_id not in seen_review_ids:
                new_rows.append(row)
                seen_review_ids.add(review_id)

        rows.extend(new_rows)

        print(f"page={page}, new={len(new_rows)}, total={len(rows)}")

        if continuation_token is None:
            break

        time.sleep(pause_sec)

    return pd.DataFrame(rows)


app_id = "com.miHoYo.GenshinImpact"

df_reviews = fetch_reviews_paged(
    app_id=app_id,
    lang="ja",
    country="jp",
    sort=Sort.NEWEST,
    count_per_page=100,
    max_pages=10,
    pause_sec=1.0,
)

output_dir = Path("googleplay_data")
output_dir.mkdir(parents=True, exist_ok=True)

csv_path = output_dir / f"{app_id}_reviews_paged.csv"
df_reviews.to_csv(csv_path, index=False, encoding="utf-8-sig")

print(f"saved: {csv_path}")
print("rows:", len(df_reviews))

レビュー取得では、短時間に大量アクセスしないように、pause_sec でリクエスト間隔を空けています。実運用では、対象アプリ数や取得件数に応じて上限を決めておくと安全です。

reviews_allを使う場合の注意点

reviews_all() を使うと、取得可能なレビューをまとめて取得できます。ただし、内部的に多数のリクエストが発生する場合があるため、大規模アプリで使う場合は注意が必要です。

from google_play_scraper import Sort, reviews_all
import pandas as pd

app_id = "com.miHoYo.GenshinImpact"

data = reviews_all(
    app_id,
    lang="ja",
    country="jp",
    sort=Sort.NEWEST,
)

df_reviews_all = pd.DataFrame(data)

print("rows:", len(df_reviews_all))
print(df_reviews_all.head())

レビュー分析では、取得件数を制御しやすい reviews() とページング処理を使う方が、再現性や負荷管理の面で扱いやすいです。

検索キーワードからアプリ一覧を取得する

search() を使うと、キーワードに一致するアプリ候補を取得できます。ジャンル内の候補収集や、競合アプリのリストアップに使えます。

from pathlib import Path

import pandas as pd
from google_play_scraper import search

query = "放置 RPG"

results = search(
    query,
    lang="ja",
    country="jp",
    n_hits=100,
)

df_search = pd.DataFrame(results)

if "appId" in df_search.columns:
    df_search = df_search.drop_duplicates(subset="appId", keep="first")

cols = [
    "appId",
    "title",
    "summary",
    "score",
    "developer",
    "free",
    "url",
]
cols = [c for c in cols if c in df_search.columns]

df_search = df_search[cols]

output_dir = Path("googleplay_data")
output_dir.mkdir(parents=True, exist_ok=True)

csv_path = output_dir / "search_results.csv"
df_search.to_csv(csv_path, index=False, encoding="utf-8-sig")

print(f"saved: {csv_path}")
print("rows:", len(df_search))
print(df_search.head())

search() の結果は軽量な検索結果なので、インストール数や詳細なカテゴリなど、すべての項目が含まれるとは限りません。詳しい情報が必要な場合は、取得した appId を使って app() で詳細情報を取得します。

権限情報を取得する

permissions() を使うと、アプリが要求する権限情報を取得できます。類似アプリ比較や、アプリの機能・プライバシー観点を確認する材料になります。

from google_play_scraper import permissions

app_id = "com.miHoYo.GenshinImpact"

perms = permissions(
    app_id,
    lang="ja",
    country="jp",
)

for group, items in perms.items():
    print(f"[{group}]")
    for item in items:
        print(" -", item)

権限情報は、レビュー分析そのものよりも、アプリ比較や安全性・機能差の確認で使うことが多いです。

Google Playレビュー分析で注意したいデータ仕様

Google Playレビューを分析するときは、いくつか注意点があります。

  • レビューは取得時点のスナップショットであり、過去の全履歴を完全に再現できるわけではありません。
  • 同じユーザーがレビューを更新した場合、過去の内容が上書きされる可能性があります。
  • レビュー削除、非表示、地域差、取得タイミングにより、取得件数は変動する場合があります。
  • reviewCreatedVersion が空になるレビューもあります。
  • レビュー本文には、誤字、表記ゆれ、絵文字、不適切表現が含まれる場合があります。
  • 星評価とレビュー本文の内容が必ずしも一致しない場合があります。

そのため、スコア推移や件数推移のグラフは、厳密な時系列の再現というより、取得データから見える傾向を把握する目的で使うのがよいです。

取得したデータの活用例

取得したGoogle Playデータは、以下のような分析に活用できます。

  • 日次・月次のレビュー件数と平均評価の推移
  • アプリバージョン別の評価比較
  • 低評価レビューと高評価レビューの比較
  • ワードクラウドやTF-IDFによる頻出語分析
  • 感情スコアリングによるポジティブ・ネガティブ傾向の把握
  • LDAやBERTopicによるトピック抽出
  • ジャンル別・開発会社別のアプリ比較

このサイトでは、取得したレビューを使った可視化・テキスト分析・感情分析・トピック抽出の記事も順番に整理しています。

次に読む記事

まとめ

この記事では、google-play-scraper を使って、Google Playのアプリ詳細、レビュー、検索結果、権限情報を取得する方法を紹介しました。

Google Playレビュー分析では、まずアプリIDを指定してレビューを取得し、CSVとして保存するところが出発点になります。その後、評価推移の可視化、レビュー本文のテキスト分析、感情分析、トピック抽出へ進めることで、アプリごとの魅力や不満点をデータから整理しやすくなります。

-Google Play, データ活用