この記事では、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.GenshinImpactPythonコードでは、このアプリ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 | 開発者返信日時 |
後続の分析では、content、score、at、reviewCreatedVersion を使うことが多いです。
ページングしながらレビューを取得する
より多くのレビューを取得したい場合は、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レビュー可視化入門|日次・月次の評価推移をPlotlyで分析する方法
- Google Playレビューのテキスト分析入門|ワードクラウド・共起ネットワーク・TF-IDFをPythonで可視化
- Google Playレビューの感情分析入門|ポジ・ネガ傾向をPythonで月次可視化する方法
- Google Playレビューのトピック抽出入門|LDAとBERTopicで話題を可視化する方法
- Google Playデータでゲーム会社の得意ジャンルを可視化する方法|検索結果をPythonで分析
- Google Playレビュー分析まとめ
まとめ
この記事では、google-play-scraper を使って、Google Playのアプリ詳細、レビュー、検索結果、権限情報を取得する方法を紹介しました。
Google Playレビュー分析では、まずアプリIDを指定してレビューを取得し、CSVとして保存するところが出発点になります。その後、評価推移の可視化、レビュー本文のテキスト分析、感情分析、トピック抽出へ進めることで、アプリごとの魅力や不満点をデータから整理しやすくなります。