Google Playレビューを分析へ使う前に、取得条件、継続取得、保存形式を揃える必要があります。この記事では、Pythonライブラリgoogle-play-scraperのreviews()で少量取得し、continuation tokenで次のページへ進み、必要な場合だけreviews_all()を検討する流れを整理します。
想定読者
- Google PlayレビューをPythonで取得したい方
- continuation tokenで継続取得したい方
- 取得条件を残してCSV保存したい方
google-play-scraperとレビュー取得の位置づけ
google-play-scraperはGoogle公式APIではなく、Google Playの公開情報を取得する外部Pythonライブラリです。レビュー取得には、件数を区切って取得するreviews()と、内部で継続取得を繰り返すreviews_all()があります。
推奨する進め方
- 最初は
reviews()で3〜100件程度を確認する - 返却フィールドとCSV形式を決める
- 必要な範囲だけcontinuation tokenで継続取得する
App IDとライブラリを準備する
App IDはGoogle Play URLのid=以降にあるPackage nameです。例としてcom.nianticlabs.pokemongoを使います。
python -m pip install -U google-play-scraper pandas取得条件や返却形式が変わったときに追跡できるよう、使用バージョンも確認しておきます。
python -m pip show google-play-scraperreviews()で少量取得する
最初から全件取得を狙わず、少量のレスポンスでフィールドと型を確認します。
- App IDと取得条件を決める
reviews()を少量で実行する- 返却件数・フィールド名・continuation tokenを確認する
from google_play_scraper import Sort, reviews
app_id = "com.nianticlabs.pokemongo"
result, continuation_token = reviews(
app_id,
lang="ja",
country="jp",
sort=Sort.NEWEST,
count=100,
filter_score_with=None,
)
print("returned:", len(result))
print("fields:", sorted(result[0].keys()) if result else [])
print("continuation:", continuation_token is not None)現行ソースでは、lang、country、sort、count、filter_score_with、filter_device_with、continuation_tokenを指定できます。countは取得希望件数であり、指定件数の返却を保証するものではありません。
取得条件を使い分ける
| 引数 | 用途 | 記録する理由 |
|---|---|---|
lang | 表示言語 | レビューや返信の言語条件を追跡する |
country | ストアの国・地域 | 取得対象の範囲を明確にする |
sort | 新着・評価順など | 取得順序による偏りを確認する |
count | 1回の取得希望件数 | 処理単位と負荷を記録する |
filter_score_with | 星評価で絞り込み | 対象スコアを明確にする |
filter_device_with | 端末条件で絞り込み | 利用した場合に条件を再現する |
分析用データでは、返却されたレビューだけでなく、これらの取得条件も同じファイルや実行ログへ残します。
continuation tokenで次のページを取得する
reviews()はレビュー一覧とcontinuation tokenを返します。次の呼び出しへtokenを渡すと、同じ取得条件を引き継いで続きを取得できます。
from google_play_scraper import Sort, reviews
app_id = "com.nianticlabs.pokemongo"
first_page, token = reviews(
app_id,
lang="ja",
country="jp",
sort=Sort.NEWEST,
count=100,
)
second_page = []
next_token = None
if token is not None:
second_page, next_token = reviews(
app_id,
continuation_token=token,
)
reviews_two_pages = first_page + second_page
print("total:", len(reviews_two_pages))
print("has next:", next_token is not None)continuation tokenはライブラリ内部の継続情報を持つオブジェクトで、永続的なAPI tokenや認証情報ではありません。長期保存して別の実行で再利用する前提にせず、処理中のページ継続に使います。
reviews_all()との違い
reviews_all()は、内部でcontinuation tokenを使いながら繰り返し取得する便利関数です。
from google_play_scraper import Sort, reviews_all
all_reviews = reviews_all(
"com.example.app",
lang="ja",
country="jp",
sort=Sort.NEWEST,
sleep_milliseconds=1000,
)
print("returned:", len(all_reviews))レビュー数が多いアプリでは、多数のHTTPリクエストと長い処理時間が発生します。標準手順として無制限取得を推奨するものではありません。まずreviews()を少量実行し、保存形式、途中保存、失敗時の再開単位を決めたうえで、必要な場合だけ使ってください。
返却される主な項目
| キー | 内容 | 注意点 |
|---|---|---|
reviewId | レビュー識別子 | 重複確認に利用 |
content | レビュー本文 | 個人情報・引用範囲に注意 |
score | 星評価 | 1〜5の値 |
thumbsUpCount | 参考になった数 | 人気や正しさを直接示す値ではない |
at | 投稿日 | CSV読込時に日時型を確認 |
reviewCreatedVersion / appVersion | アプリバージョン | 欠損する可能性がある |
replyContent / repliedAt | 運営からの返信 | 返信がない場合は欠損 |
現行の少量確認では、reviewCreatedVersionに加えてappVersionが返る場合がありました。処理では両方の存在を確認し、欠損を許容してください。
pandasで整理してCSV保存する
レビュー行へ取得日時と取得条件を付加し、CSVへ保存します。ユーザー画像URLなど分析に不要な列は、目的に応じて保存対象から外します。
from datetime import datetime, timezone
import pandas as pd
from google_play_scraper import Sort, reviews
app_id = "com.nianticlabs.pokemongo"
lang = "ja"
country = "jp"
sort = Sort.NEWEST
rows, continuation_token = reviews(
app_id,
lang=lang,
country=country,
sort=sort,
count=100,
)
df = pd.DataFrame(rows)
keep_columns = [
"reviewId",
"content",
"score",
"thumbsUpCount",
"at",
"reviewCreatedVersion",
"appVersion",
"replyContent",
"repliedAt",
]
df = df.reindex(columns=keep_columns)
df.insert(0, "fetched_at_utc", datetime.now(timezone.utc).isoformat())
df.insert(1, "source_app_id", app_id)
df.insert(2, "source_lang", lang)
df.insert(3, "source_country", country)
df.insert(4, "source_sort", sort.name)
df.to_csv(
"google_play_reviews.csv",
index=False,
encoding="utf-8-sig",
)
print("saved rows:", len(df))重複・欠損と継続処理を確認する
ページをまたいで追加保存する前に、識別子の重複と主要列の欠損を確認します。
print("rows:", len(df))
print("duplicate reviewId:", df["reviewId"].duplicated().sum())
print(df[["reviewId", "content", "score", "at"]].isna().sum())
df = df.drop_duplicates(subset=["reviewId"], keep="last")大量取得では、ページごとに一時保存し、最後にreviewIdで重複を整理する方法が安全です。再開に備えて、App ID、取得日時、条件、完了したページ数、エラー内容をログへ残します。
利用上の注意
google-play-scraperはGoogle公式APIではなく、Google Play側の変更で動作が変わる可能性があります。countは指定件数の返却を保証しません。取得可能範囲や並びはストア側の状態にも依存します。- 大量取得では途中保存、待機、再開方法、エラーログを先に設計し、リクエスト負荷を抑えてください。
- レビュー本文、表示名、画像URLなどは利用目的に必要な範囲だけ扱い、公開・共有時は個人情報や引用範囲に注意してください。
- 取得日と取得条件を必ず保存し、異なる条件のデータを無意識に混在させないでください。
次に読む記事
取得済みレビューは、目的に応じて可視化やテキスト分析へ進めます。