Skip to main content
Case study

Google Maps Lead Scraper

Targeted lead scraper for local service businesses.

Shipped2026

Playwright · Python · pandas · asyncio

Google Maps Lead Scraper previewIllustration
Illustration of the tool. A rendered depiction of my own output, not a live capture.
Context

Outbound sales for local service businesses needs targeted lists. HVAC contractors in Phoenix with 20-300 Google reviews. Medspas in Scottsdale open more than three years. Plumbers in Mesa with a website but no blog.

Apollo, Outscraper, and the other structured-data vendors charge per lead and miss half the long tail. Google Maps has all of it, for free, if you can get it out.

Constraints

Google Maps rate-limits aggressive scraping and will serve stale or sparse results if you look like a bot.

Maps results are paginated and lazy-loaded, which breaks naive scrapers.

Results include chain locations, duplicates, and closed businesses that need filtering.

Phone numbers and websites are behind a second click per result.

Approach

Playwright-driven with human-like scroll, randomized delays, and session rotation. Each search query (category + geography) triggers an exhaustive scroll to the end of results, then a per-result detail pull for phone, website, review count, and rating.

Deduplication runs on normalized business name plus address. Filters strip chains (based on a known-chains list) and closed/temporarily-closed results.

Output is a structured CSV with business name, owner name where available, phone, website, review count, star rating, and address. Drops straight into Apollo for email enrichment or into a dialer for cold calls.

Result

Built the initial lead list for BasisWeb cold outreach. 51 verified Phoenix-metro HVAC and plumbing leads in the first batch, feeding the cold email and call pipelines that followed.

Stack

Playwright · Python · pandas · asyncio · proxy rotation · CSV export