如果你曾经想过要搭建一份精准的销售名单、开拓新市场,或者做竞品对标,你一定知道 Google 地图有多像一座数据金矿。更关键的是,每月有超过 15 亿次“附近”搜索,而且 76% 的本地搜索用户会在 24 小时内到店(),这也让大家对最新、基于地理位置的商家数据需求只增不减。
不管你做的是销售、营销还是运营,只要能从 Google 地图提取结构化数据,结果可能就完全不同:你拿到的究竟是冷冰冰的陌生开发名单,还是更容易成交的高意向线索。
我在 SaaS 和自动化领域做了很多年,亲眼见过团队怎么借助 Python(以及现在像 这样的 AI 工具)把 Google 地图变成战略资产。在这篇指南里,我会手把手拆解 2026 年如何用 Python 抓取 Google 地图数据——包括代码、合规建议,以及和无代码方案的对比。无论你是 Python 老手,还是只想尽快拿到能用的数据,这篇文章都适合你。
用 Python 抓取 Google 地图到底是什么意思?
先从最基础的说起:用 Python 抓取 Google 地图,就是通过程序自动提取商家信息——比如名称、地址、评分、评论、电话号码和坐标——然后拿去做分析、筛选,并导出到业务系统里。

主要有两种实现方式:
- Google Maps Places API:这是官方授权的做法。你通过 API key 向 Google 服务器发起查询,拿到结构化 JSON 数据。它稳定、可预测,而且大多数情况下也更合规,但会受配额和费用限制。
- 抓取网页 HTML:你使用 Playwright 或 Selenium 这类工具自动控制浏览器,打开 Google 地图、执行搜索,并解析渲染后的页面。灵活性更高,但也更脆弱——Google 经常调整页面结构,而且直接抓取 HTML 可能违反其服务条款。
你通常可以提取的数据字段包括:
- 商家名称
- 类别/类型
- 完整地址(以及城市、州、省、邮编、国家)
- 纬度和经度
- 电话号码
- 网站链接
- 评分和评论数量
- 价格等级
- 商家状态(营业/歇业)
- 营业时间
- Place ID(Google 的唯一标识)
- Google 地图链接
为什么这很重要? 因为这些字段几乎能支撑线索开发、区域规划、竞品分析和市场研究等各种工作。重点不是“抓得越多越好”,而是围绕业务目标,精准拿到真正有用的数据。
为什么销售和营销团队会用 Python 从 Google 地图提取数据
说得更直接一点:为什么到了 2026 年,这么多销售和营销团队都在盯着 Google 地图数据?
- 线索开发:批量整理本地商家名单,附上联系方式和评分,用于外呼和触达。
- 区域规划:根据真实的商家密度和类型,划分销售区域、配送范围或服务范围。
- 竞品监控:长期追踪竞争对手的位置、评分和评论,捕捉趋势与机会。
- 市场调研:分析商家类别、营业时间和评论情绪,为市场进入策略提供依据。
- 选址决策:在房地产和零售场景下,结合周边配套、客流和竞争情况评估潜在位置。
真实业务影响: 根据 ,92% 的销售组织计划增加 AI/数据投入;而使用精准本地数据的团队,其转化率可比依赖泛化冷名单的团队高出 8 倍()。另有一项特许经营线索研究发现,基于 Google 地图的线索名单,每投入 1 美元可带来 15 美元的新收入。
把业务目标对应到 Google 地图字段:
| 业务目标 | 所需 Google 地图字段 |
|---|---|
| 本地线索名单 | name, address, phone, website, category |
| 区域规划 | name, lat/lng, business_status, opening_hours |
| 竞品对标 | name, rating, userRatingCount, priceLevel, reviews |
| 选址分析 | category, lat/lng, review density, openingDate |
| 舆情/菜单洞察 | reviews, editorialSummary, photos, types |
| 邮件/电话触达 | nationalPhoneNumber, websiteUri(后续可再补充) |
搭建 Python Google 地图爬虫:工具与准备工作
在开始抓取之前,你需要先把 Python 环境和相关工具准备好。2026 年建议这样做:
1. 安装 Python 和所需库
推荐的 Python 版本: 3.10 或更高。
安装核心依赖:
1pip install \
2 requests==2.33.1 httpx==0.28.1 \
3 beautifulsoup4==4.14.3 lxml==6.0.3 \
4 pandas==2.3.3 \
5 selenium==4.43.0 playwright==1.58.0 \
6 googlemaps==4.10.0 google-maps-places==0.8.0 \
7 schedule==1.2.2 APScheduler==3.11.2 \
8 python-dotenv==1.2.2 tenacity==9.1.4
9playwright install chromium
这些库分别做什么:
requests,httpx:发起 HTTP 请求(API 调用)beautifulsoup4,lxml:解析 HTML(用于网页抓取)pandas:数据清洗、分析、导出selenium,playwright:浏览器自动化(用于 HTML 抓取)googlemaps,google-maps-places:Google 地图 API 客户端schedule,APScheduler:任务调度python-dotenv:从.env文件安全加载 API keytenacity:重试与错误处理
2. 获取 Google Maps API Key(用于基于 API 的抓取)
- 前往 。
- 创建或选择一个项目。
- 开启计费(即使是免费额度也需要)。
- 在 APIs & Services > Library 中启用 “Places API (New)”。
- 进入 Credentials > Create Credentials > API Key。
- 将 key 绑定到指定 API 和 IP,提高安全性。
- 把 API key 存到
.env文件中(不要直接写进代码仓库):
1GOOGLE_MAPS_API_KEY=your_actual_api_key_here
注意: 截至 2025 年 3 月,Google 已不再提供统一的每月 200 美元免费额度,而是按不同 API 层级提供每月免费阈值(见 )。
如何使用 Python 从 Google 地图提取数据:分步指南
下面我们把两种主要方案——基于 API 和 抓取 HTML——拆开讲,这样你可以按需求选最合适的一种。
方案 1:使用 Google Maps Places API(推荐)
第 1 步:安装并导入所需库
1import os
2import httpx
3import pandas as pd
4from dotenv import load_dotenv
第 2 步:安全加载 API Key
1load_dotenv()
2API_KEY = os.environ["GOOGLE_MAPS_API_KEY"]
第 3 步:构建搜索查询
你会使用 Text Search 接口来查找符合条件的商家。
1URL = "https://places.googleapis.com/v1/places:searchText"
2FIELD_MASK = ",".join([
3 "places.id", "places.displayName", "places.formattedAddress",
4 "places.location", "places.rating", "places.userRatingCount",
5 "places.priceLevel", "places.types",
6 "places.nationalPhoneNumber", "places.websiteUri",
7 "nextPageToken",
8])
第 4 步:发起 API 请求
1def text_search(query, lat, lng, radius=3000, min_rating=4.0):
2 body = {
3 "textQuery": query,
4 "minRating": min_rating, # 服务端过滤
5 "includedType": "restaurant",
6 "openNow": False,
7 "pageSize": 20,
8 "locationBias": {
9 "circle": {
10 "center": {"latitude": lat, "longitude": lng},
11 "radius": radius,
12 }
13 },
14 }
15 headers = {
16 "Content-Type": "application/json",
17 "X-Goog-Api-Key": API_KEY,
18 "X-Goog-FieldMask": FIELD_MASK, # 记得始终设置!
19 }
20 r = httpx.post(URL, json=body, headers=headers, timeout=30)
21 r.raise_for_status()
22 return r.json()
第 5 步:处理分页并汇总结果
1def collect_all_results(query, lat, lng, radius=3000, min_rating=4.0):
2 results = []
3 next_page_token = None
4 while True:
5 data = text_search(query, lat, lng, radius, min_rating)
6 places = data.get('places', [])
7 results.extend(places)
8 next_page_token = data.get('nextPageToken')
9 if not next_page_token:
10 break
11 return results
第 6 步:使用 Pandas 导出数据
1df = pd.DataFrame(collect_all_results("coffee shops in Brooklyn", 40.6782, -73.9442))
2df.to_csv("brooklyn_coffee_shops.csv", index=False)
实用建议:
- 一定要设置
X-Goog-FieldMask头部来控制成本。如果你请求评论或图片,单千次请求的价格可能会从 5 美元跳到 25 美元(见 )。 - 使用服务端过滤条件(如
minRating、includedType、locationBias)来避免把配额浪费在无关结果上。 - 缓存
place_id以便去重和后续更新。
方案 2:抓取 Google 地图 HTML(适合学习或一次性使用)
警告: Google 地图是单页应用。你必须使用浏览器自动化工具(Playwright 或 Selenium),而且抓取 HTML 可能违反 Google 的条款。请把它用于研究,不要用于生产环境。
第 1 步:安装 Playwright 并启动浏览器
1from playwright.sync_api import sync_playwright
2import time, re
3def scrape_maps(query, max_results=100):
4 with sync_playwright() as pw:
5 browser = pw.chromium.launch(headless=True)
6 ctx = browser.new_context(
7 user_agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
8 locale="en-US",
9 )
10 page = ctx.new_page()
11 page.goto("https://www.google.com/maps", timeout=60_000)
12 page.fill("#searchboxinput", query)
13 page.click('button[aria-label="Search"]')
14 page.wait_for_selector('div[role="feed"]')
15 feed = page.locator('div[role="feed"]')
16 prev = 0
17 while True:
18 feed.evaluate("el => el.scrollBy(0, el.scrollHeight)")
19 time.sleep(2)
20 count = page.locator('div[role="feed"] > div > div[jsaction]').count()
21 if count == prev or count >= max_results:
22 break
23 prev = count
24 if page.locator("text=You've reached the end of the list").count():
25 break
26 rows = []
27 cards = page.locator('div[role="feed"] > div > div[jsaction]')
28 for i in range(cards.count()):
29 c = cards.nth(i)
30 name = c.locator("div.fontHeadlineSmall").inner_text() if c.locator("div.fontHeadlineSmall").count() else ""
31 rating_el = c.locator('span[role="img"]').first
32 raw = rating_el.get_attribute("aria-label") if rating_el.count() else ""
33 m = re.search(r"([\d.]+)\s+stars?\s+([\d,]+)\s+Reviews", raw or "")
34 rating = float(m.group(1)) if m else None
35 reviews = int(m.group(2).replace(",", "")) if m else None
36 rows.append({"name": name, "rating": rating, "reviews": reviews})
37 browser.close()
38 return rows
提示:
- Google 会隔一段时间随机调整 CSS class,所以这类代码通常要定期维护。
- 运行时尽量模拟真人节奏,不要抓得太快,以降低被拦截的风险。
- 不要尝试绕过验证码或 Google 的 SearchGuard 系统——这可能带来法律风险。
不要盲目抓取:如何精准锁定你真正需要的数据
把所有内容都抓下来,往往只会浪费时间,还会让数据集又大又乱。下面是如何只抓取有价值的数据:
- 先生成定向 URL 列表:利用 Google 地图自带的筛选条件(类别、位置、评分、是否营业)缩小范围后再抓取。
- 使用短语匹配:搜索精确的商家类型或关键词,例如“austin vegan bakery”。
- 地理筛选:指定城市、街区,甚至坐标和半径,保证定位更准。
- 服务端过滤(API):在 API 请求体中使用
minRating、includedType和locationBias。 - 客户端过滤(Python):抓取后,用 pandas 筛出评分高于 4.0、评论超过 50 条,或属于特定类别的商家。
示例:只筛选曼哈顿评分高于 4.0 的餐厅
1df = pd.DataFrame(results)
2filtered = df[(df['rating'] >= 4.0) & (df['types'].apply(lambda x: 'restaurant' in x))]
3filtered.to_csv("manhattan_top_restaurants.csv", index=False)
使用 Python 库整理并导出 Google 地图数据
抓取完成后,下一步就是清洗、分析,再导出给团队使用。
用 Pandas 清洗和结构化数据
1import pandas as pd
2df = pd.read_json("brooklyn_restaurants.json")
3df = (
4 df.dropna(subset=["name", "address"])
5 .drop_duplicates(subset=["place_id"])
6 .assign(
7 name=lambda d: d["name"].str.strip(),
8 phone=lambda d: d["phone"].astype(str)
9 .str.replace(r"\D", "", regex=True)
10 .str.replace(r"^1?(\d{10})$", r"+1\1", regex=True),
11 rating=lambda d: pd.to_numeric(d["rating"], errors="coerce"),
12 user_ratings_total=lambda d: pd.to_numeric(
13 d["user_ratings_total"], errors="coerce"
14 ).fillna(0).astype("int32"),
15 )
16)
分析和汇总数据
示例:按街区计算平均评分
1by_neighborhood = (
2 df.groupby("neighborhood", as_index=False)
3 .agg(avg_rating=("rating", "mean"),
4 n_places=("place_id", "nunique"),
5 median_reviews=("user_ratings_total", "median"))
6 .sort_values("avg_rating", ascending=False)
7)
导出为 Excel 或 CSV
1df.to_csv("brooklyn_top.csv", index=False)
2df.to_excel("brooklyn_top.xlsx", index=False, sheet_name="Top Rated")
数据量很大? 可以用 Parquet 格式,速度更快、体积更小:
1df.to_parquet("brooklyn_top.parquet", compression="zstd")
Thunderbit:面向 Python Google 地图爬虫的 AI 方案
如果你心里正在想:“就为了做一份线索名单,前置配置也太多了吧”,那你并不孤单。这也是我们打造 的原因——一款 AI 驱动、无需代码的网页爬虫,让抓取 Google 地图数据(以及更多内容)变成点几下就能完成的事。
为什么选择 Thunderbit?
- 无需编程,也不需要 API key:只要打开 ,进入 Google 地图,点击“AI Suggest Fields”。
- AI 自动识别字段:Thunderbit 的 AI 会读取页面并推荐合适的列——名称、地址、评分、电话、网站等。
- 子页面抓取:想把每个商家网站上的信息也补进表格?Thunderbit 可以自动访问各个子页面并提取额外信息。
- 导出到 Excel、Google Sheets、Airtable 或 Notion:不用再手动折腾 pandas,点一下“导出”就能交给团队使用。
- 定时抓取:可以设置周期性任务,自动监控竞争对手或刷新线索名单。
- 几乎无需维护:Thunderbit 的 AI 会适应网站变化,你不需要频繁修复失效脚本。

Thunderbit 与 Python 工作流对比:
| 步骤 | Python 爬虫 | Thunderbit |
|---|---|---|
| 安装工具 | 30–60 分钟(Python、pip、依赖库) | 2 分钟(Chrome 扩展) |
| API key 配置 | 10–30 分钟(Cloud Console) | 不需要 |
| 字段选择 | 手写代码、字段掩码 | AI Suggest Fields(1 次点击) |
| 数据提取 | 编写/运行脚本,处理错误 | 点击“Scrape” |
| 导出 | 用 pandas 导出 CSV/Excel | 导出到 Excel/Sheets/Notion |
| 维护 | 网站变化后需手动更新 | AI 自动适配 |
额外福利: Thunderbit 受到全球超过 信赖,而且免费套餐可免费抓取最多 6 个页面(试用加成后可达 10 个)。
保持合规:Google 地图服务条款与抓取伦理
这里是很多 Python 教程最容易过时、也最危险的部分。2026 年你需要知道这些:
- Google Maps Platform 服务条款 §3.2.3 明确禁止通过官方 API 之外的方式抓取、缓存或导出数据()。唯一例外是:经纬度可以缓存最多 30 天;Place ID 可以无限期保存。
- API 用户受合同约束:一旦你使用 API key,就代表你已经同意了 Google 的条款——即便你抓取的是公开数据。
- 绕过技术屏障(验证码、SearchGuard) 现在可能构成 DMCA §1201 违规,甚至涉及刑事处罚()。
- GDPR 与隐私法规:如果你从 Google 地图收集个人数据(邮箱、电话、评论者姓名),就必须具备合法处理依据,并尊重删除请求。2024 年,法国 CNIL 就因抓取 LinkedIn 联系人数据对 KASPR 罚款 20 万欧元()。
- 最佳实践:
- 尽可能优先使用 Places API。
- 控制请求频率(API 不超过 10 QPS,HTML 抓取每秒 1–2 次)。
- 不要绕过验证码或任何技术限制。
- 不要重新分发抓取到的个人数据。
- 尊重退出和删除请求。
- 始终检查当地法律——GDPR、CCPA 等都在持续执法。
一句话总结: 如果你特别在意合规,最好坚持使用 API,并尽量减少收集的数据量。对大多数业务用户来说,像 Thunderbit 这样的无代码工具能明显降低风险暴露(无需 API key,也无需再分发数据)。
使用 Python 为 Google 地图抓取设置定时与自动化
如果你需要持续更新数据,比如每周监控竞品,或者每月刷新线索名单,那么自动化就是你的好帮手。
用 schedule 做简单定时
1import schedule, time
2from my_scraper import run_job
3schedule.every().day.at("03:00").do(run_job, query="restaurants in Brooklyn")
4schedule.every(6).hours.do(run_job, query="coffee shops in Manhattan")
5while True:
6 schedule.run_pending()
7 time.sleep(30)
用 APScheduler 做生产级调度
1from apscheduler.schedulers.background import BackgroundScheduler
2from apscheduler.triggers.cron import CronTrigger
3sched = BackgroundScheduler(timezone="America/New_York")
4sched.add_job(
5 run_job,
6 CronTrigger(hour=3, minute=15, jitter=600), # 凌晨 3:15,浮动 ±10 分钟
7 kwargs={"query": "restaurants in Brooklyn"},
8 id="brooklyn_daily",
9 max_instances=1,
10 coalesce=True,
11 misfire_grace_time=3600,
12)
13sched.start()
安全自动化建议
- 给调度加入随机抖动,避免形成过于规律的访问模式。
- 如果是 HTML 抓取,速度尽量控制在每秒 1–2 个请求以内。
- 如果使用 API,注意监控配额并设置计费提醒。
- 始终记录错误,并为失败请求保留一个“死信”文件。
Thunderbit 额外优势: 使用 Thunderbit,你可以直接在界面里设置周期性抓取——不需要代码、不需要 cron 任务,也不需要服务器。
核心结论:高效、精准且合规地提取 Google 地图数据
我们来快速回顾一下重点:
- Google 地图是最重要的商家位置数据来源,从线索开发到市场研究都离不开它。
- Python 抓取灵活、可控,但也带来更多配置、维护和合规成本——尤其是在 Google 反爬和法律监管不断加强的今天。
- 基于 API 的提取 对大多数团队来说,是最稳妥、最可扩展的路径。记得始终使用字段掩码和服务端过滤来控制成本。
- HTML 抓取脆弱且风险更高,只适合一次性研究,且绝不要绕过技术限制。
- 精准锁定数据:结合短语匹配、地理过滤和 pandas 工作流,只提取真正需要的信息。
- Thunderbit 是非技术用户最快的路径:AI 驱动、无需配置、立即导出,还内置定时功能。
- 合规非常重要:尊重 Google 条款、隐私法规和请求频率限制,才能避免后续麻烦。
想了解更多教程和技巧,可以查看 和我们的 。
常见问题
1. 2026 年用 Python 抓取 Google 地图数据合法吗?
通过官方 API 抓取 Google 地图数据,只要遵守 Google 条款、控制配额,并且不重新分发受限数据,就是允许的。直接抓取 Google 地图 HTML 明确违反 Google 的服务条款,并且会带来法律风险,尤其是在你绕过技术屏障或未经同意收集个人数据时。务必同时检查本地法律(GDPR、CCPA 等),并遵循合规最佳实践。
2. Google Maps API 和抓取网页 HTML 有什么区别?
API 稳定、授权明确,而且本来就是为数据提取设计的,但需要 API key,并且受配额与费用限制。HTML 抓取则是通过浏览器自动化从渲染后的页面提取数据,灵活性更高,但非常脆弱(页面结构经常变),而且可能违反条款,法律风险更高。对于大多数商业用途,API 是更推荐的路径。
3. 2026 年用 Python 提取 Google 地图数据要花多少钱?
Google Places API 按每 1,000 次请求计费,价格大约从 5 美元(Essentials)到 25 美元(Enterprise+Atmosphere)不等,具体取决于你请求的字段。虽然有每月免费阈值(Essentials 10,000 次、Pro 5,000 次、Enterprise 1,000 次),但大规模抓取的成本仍会很快累积。务必使用字段掩码和服务端过滤来控制费用。
4. Thunderbit 和基于 Python 的 Google 地图爬虫相比怎么样?
Thunderbit 是一款无需编码、AI 驱动的网页爬虫,可以让你在没有编程、没有 API key、也无需维护脚本的情况下提取 Google 地图数据(以及更多内容)。它非常适合销售和营销团队,能快速、稳定地导出到 Excel、Google Sheets、Airtable 或 Notion。对于需要自定义逻辑的技术用户来说,Python 更灵活,但也需要更多配置和合规管理。
5. 如何自动定期提取 Google 地图数据?
如果使用 Python,可以借助 schedule 或 APScheduler 这类调度库,按日、按周等固定间隔运行爬虫。为了避免被识别,建议加入随机抖动,并持续监控 API 配额。使用 Thunderbit 时,你可以直接在界面里设置周期性抓取——无需代码,也不用搭建服务器。
准备好把 Google 地图变成你的销售和营销超级武器了吗?无论你是 Python 爱好者,还是想找最快的无代码方案,2026 年都有成熟工具可用。试试 ,体验即开即用的 AI 抓取;或者直接上手 API 方案。无论哪种方式,祝你的线索名单永远最新、导出始终干净、营销活动都能触达高转化本地客户。祝你抓取顺利!
了解更多
