惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

腾讯CDC
N
Netflix TechBlog - Medium
aimingoo的专栏
aimingoo的专栏
P
Proofpoint News Feed
F
Fortinet All Blogs
大猫的无限游戏
大猫的无限游戏
I
InfoQ
V
V2EX
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
有赞技术团队
有赞技术团队
G
Google Developers Blog
L
LangChain Blog
博客园_首页
M
MIT News - Artificial intelligence
H
Hackread – Cybersecurity News, Data Breaches, AI and More
月光博客
月光博客
IT之家
IT之家
量子位
宝玉的分享
宝玉的分享
S
SegmentFault 最新的问题
Stack Overflow Blog
Stack Overflow Blog
V
Visual Studio Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
雷峰网
雷峰网

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant
How to Scrape Google Maps for Local Business Leads (with ...
FruityP · 2026-06-16 · via DEV Community

FruityP

If you've ever needed a list of local businesses - every dentist in Manchester, every plumber in Leeds - with their contact details, you've probably hit the same wall I did:

  • Google's Places API is rate-limited, costs money once you scale, and annoyingly doesn't return email addresses at all.
  • Copy-pasting from Maps by hand is soul-destroying past the first ten rows.
  • Most "scrapers" give you the name and a phone number, then stop right where the value starts: the email.

This guide shows a practical way to pull structured business data straight from Google Maps and auto-enrich each result with emails, extra phones, and social links - no Google API key, exportable to JSON/CSV/Excel, and callable from code.

What you actually get per business

{
  "name": "Ringway Dental - Cheadle",
  "address": "187 Finney Ln, Heald Green, Cheadle SK8 3PX",
  "phone": "0161 437 2029",
  "website": "https://www.ringwaydental.com/",
  "rating": 5,
  "reviewsCount": 598,
  "category": "Dental clinic",
  "lat": 53.37, "lng": -2.22,
  "emails": ["reception@ringwaydental.com"],     // ← enriched from the website
  "socialLinks": { "facebook": "...", "instagram": "..." },
  "extraPhones": ["..."]
}

The first block (name → coordinates) comes from Maps. The emails / socialLinks / extraPhones are the bit that makes a list actually usable for outreach - they're crawled from each business's own website.

The fast way: a ready-made Actor

Rather than build and babysit the scraping yourself, I packaged this as an Apify Actor: Google Maps Scraper. You give it search terms + locations; it returns enriched rows.

Input:

{
  "searchTerms": ["dentists"],
  "locations": ["Manchester, UK"],
  "maxPlacesPerSearch": 50,
  "scrapeContacts": true,
  "relatedEmailsOnly": true
}

That's it. scrapeContacts: true turns on the website crawl for emails/socials; relatedEmailsOnly keeps only emails that belong to the business's own domain (so you don't get random gmail noise).

Call it from code (Python)

Every Apify Actor exposes a REST API, so you can run it from a script and stream the results:

from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")

run = client.actor("fruityp/google-maps-scraper").call(run_input={
    "searchTerms": ["plumbers"],
    "locations": ["Leeds, UK"],
    "maxPlacesPerSearch": 50,
    "scrapeContacts": True,
})

for biz in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(biz["name"], biz.get("phone"), biz.get("emails"))

Real output from that exact run:

Plumbers Leeds            0113 433 3119   []
Norton Plumbing          07730 560422     ['alex@nortonplumbing.co.uk']
SFR Plumbing & Heating   07833 476252     []

Pipe iterate_items() straight into a CSV, a Google Sheet, your CRM, or a cold-email tool.

Going past the ~per-area cap

A single Google Maps viewport only surfaces a few hundred results before it stops. If you ask for more than one area's worth, the Actor automatically expands the search across sub-localities (neighbourhoods, postcode districts) and dedupes by place ID - so "restaurants" in "Manchester, UK" with a high limit returns hundreds of unique places, not the same 100 on repeat.

Who this is actually for

  • Agencies / freelancers building targeted outreach lists ("every dental practice in the North West, with email").
  • Local SaaS / service businesses finding prospects in a region.
  • Market research - pull a whole category in a city with ratings + review counts to map the competitive landscape.
  • A neat niche: filter to businesses without a website and you've got a ready-made list to sell web/SEO services to.

Why not just use the official Places API?

For pure place data, the Places API is fine - but for lead generation it falls short: it's metered/paid at volume, and it won't give you emails. The whole point of a lead list is the contact you can actually reach, and that lives on the business's website, not in the API. That's the gap this fills.

A note on ethics & limits

This collects public business listing data. Respect Google's and each site's terms, don't hammer at absurd rates, and don't use scraped contacts for spam - use them for genuine, relevant outreach. Deleted/removed data isn't surfaced.

Wrap-up

If you need local-business leads with contact details, the combination of Maps data + website enrichment is the practical recipe - and you don't need Google's API to do it.

👉 Try it here: Google Maps Scraper on Apify (free to start; bring your own proxy or use Apify's).

If you build something with it, I'd love to hear what - drop a comment.