← All builds
Automation

Lead Generation Scraper for Website AI Assistant Sales

Python scraper that generates targeted lead lists for my Website AI assistant business. Configurable for any location and business type — the 1,019-lead Queensland run shown here took about 20 minutes.

Lead Generation Scraper for Website AI Assistant Sales
PythonGoogle Places APIRequests

I'm selling Website AI assistants to Australian service professionals — a Claude-powered assistant embedded on their site to handle client questions and booking enquiries. To sell anything you need people to sell to, and I wasn't going to build that list manually.

The scraper queries Google Places with configurable location and category parameters. For the run shown here, I targeted five Queensland and northern NSW locations — Sunshine Coast, Noosa, Brisbane, Gold Coast, Byron Bay — against thirteen service categories: physios, naturopaths, personal trainers, life coaches, psychologists, counsellors, family lawyers, mortgage brokers, beauty and cosmetic clinics, medispas. Every combination, twenty results each. Raw output is business name, address, phone, and website.

The locations and categories are just config variables. I can point this at Melbourne law firms, Sydney yoga studios, or Perth accountants and get the same structured output in minutes.

End result for this run: 1,019 leads with contact info, ready for outreach.

Under the Hood

Building search queries from config

LOCATIONS = [
    "Sunshine Coast, Australia",
    "Noosa, Australia",
    "Brisbane, Australia",
    "Gold Coast, Australia",
    "Byron Bay, Australia",
]

CATEGORIES = [
    # Health
    "physiotherapist", "nutritionist", "naturopath", "osteopath",
    # Wellness
    "personal trainer", "life coach", "psychologist", "counsellor",
    # Professional services
    "family lawyer", "mortgage broker",
    # Aesthetics
    "beauty clinic", "cosmetic clinic", "medispa",
]

MAX_RESULTS_PER_SEARCH = 20

def collect_leads(client):
    leads = []
    for location in LOCATIONS:
        for category in CATEGORIES:
            results = client.places(
                query=f"{category} near {location}",
                type="establishment"
            ).get("results", [])[:MAX_RESULTS_PER_SEARCH]
            leads.extend(results)
    return leads  # 5 locations × 13 categories × 20 results = up to 1,300

Deduplication and export

# Google Places returns duplicates across location boundaries
def deduplicate_leads(leads):
    seen = set()
    unique = []
    for lead in leads:
        place_id = lead.get("place_id")
        if place_id and place_id not in seen:
            seen.add(place_id)
            unique.append(lead)
    return unique

leads = deduplicate_leads(collect_leads(client))
# Export to CSV: name, address, phone, website, place_id

Why this matters

Most B2B sales advice says "just go on LinkedIn and start DMing people." That works if you're selling to marketers who live on LinkedIn. Service professionals — the ones running physio clinics and law offices — aren't checking LinkedIn DMs. They have websites with contact forms.

This scraper builds outreach lists from actual service businesses with public websites and phone numbers. It's fast, it's flexible, and it scales to any geography or vertical I want to target.