Unified Google Play + Apple App Store review scraper with ASO rollup signals — rating distribution, trend, velocity, and keyword frequency across both stores in one run. Pay-Per-Event, no login, no API key.
Scaffolded via apify create --template python-start, then overlaid
with the DevilScrapes house pattern: .actor/ (actor.json,
input/output/dataset schemas, Dockerfile), src/__init__.py +
src/__main__.py entry point, pyproject.toml (deps:
apify, curl-cffi, pydantic — no Crawlee, no HTML parser; this
Actor drives direct curl-cffi JSON/RPC calls per design.md), README
skeleton, tests/test_main.py smoke test.
.actor/input_schema.json is a first-pass version of design.md's
"Input Schema" table (apps, maxReviewsPerApp, playHl, playGl,
includeRollup, proxyConfiguration) — finalized at T02/T11 once
src/models.py's ActorInput/AppTarget land.
src/models.py (ActorInput, AppTarget, ResultRow, RollupRow),
src/http_client.py, src/play_client.py + src/play_parser.py,
src/apple_client.py + src/apple_parser.py, src/rollup.py,
src/scraper.py, and the real src/main.py orchestration are not
implemented yet — see
docs/specs/app-store-reviews-aso-scraper/tasks.md (T02-T10).
.actor/dataset_schema.json and .actor/pay_per_event.json are
placeholder/deferred respectively — finalized at T11 per
docs/specs/app-store-reviews-aso-scraper/design.md "File Plan".
src/main.py currently reads input, logs it, and pushes one
{"placeholder": true, ...} dataset row — proves the Actor boots
end-to-end; not real scraping.