Google Playデータ取得 データ取得

Google PlayレビューをPythonで取得する方法|google-play-scraperのreviews()と継続取得

Google Playレビューを分析へ使う前に、取得条件、継続取得、保存形式を揃える必要があります。この記事では、Pythonライブラリgoogle-play-scraperreviews()で少量取得し、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-scraper

reviews()で少量取得する

最初から全件取得を狙わず、少量のレスポンスでフィールドと型を確認します。

  1. App IDと取得条件を決める
  2. reviews()を少量で実行する
  3. 返却件数・フィールド名・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)

現行ソースでは、langcountrysortcountfilter_score_withfilter_device_withcontinuation_tokenを指定できます。countは取得希望件数であり、指定件数の返却を保証するものではありません。

取得条件を使い分ける

引数用途記録する理由
lang表示言語レビューや返信の言語条件を追跡する
countryストアの国・地域取得対象の範囲を明確にする
sort新着・評価順など取得順序による偏りを確認する
count1回の取得希望件数処理単位と負荷を記録する
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などは利用目的に必要な範囲だけ扱い、公開・共有時は個人情報や引用範囲に注意してください。
  • 取得日と取得条件を必ず保存し、異なる条件のデータを無意識に混在させないでください。

次に読む記事

取得済みレビューは、目的に応じて可視化やテキスト分析へ進めます。

-Google Playデータ取得, データ取得