Scrape structured Trustpilot reviews and business-summary data across multiple businesses in one run, with pagination and star-rating filtering. Includes verification level, company replies, and trust score — fields incumbents often skip.
Implemented the real crawl: challenge.py (one Camoufox launch per run
clears the block and extracts the replayable cookie jar, REQ-1/REQ-2),
browser.py (Camoufox launch/page primitives, structural copy of the
justdial/idealista pattern), scraper.py (curl-cffi TrustpilotSession
handling pagination, star filtering, retry/backoff, and per-row
ResultRow validation), and parser.py (pure __NEXT_DATA__
extraction/mapping, no I/O).
main.py now: validates input, charges actor-start once (REQ-9),
solves the challenge once, dispatches businesses sequentially with fault
isolation (REQ-7), dedupes rows by review_id before pushing and
charging result-row (REQ-8), applies the client-side language
fallback filter, and fails loud only when the run's total is zero
(REQ-6).
Added tests/fixtures/next_data_page1.json / next_data_page2.json /
next_data_stars5.json / next_data_empty.json (synthesized from the
confirmed live wire shape in research/RECON-trustpilot-2026-09-12.md)
and a full unit-test suite across parser, browser, challenge,
scraper, and main (72 tests, mocked Camoufox/curl-cffi — no live
network in CI).
Added promo.json per docs/PROMO-MANIFEST.md.
0.0.1 — 2026-09-12
Scaffolded via actor-scaffolder from docs/specs/trustpilot-reviews-scraper/spec.md
and design.md. .actor/actor.json, input_schema.json,
dataset_schema.json, output_schema.json, pay_per_event.json,
Dockerfile, pyproject.toml, src/models.py (real ActorInput /
ResultRow), and stub modules for challenge.py / browser.py /
scraper.py / parser.py.
src/main.py is a placeholder that validates input, charges
actor-start once, and pushes a single {"placeholder": true, ...}
dataset row — not the real crawl. crawlee-developer implements the
Camoufox challenge-solve + curl-cffi crawl loop next.
.actor/icon.svg is intentionally not part of this commit —
actor-icon-designer owns it exclusively.