如何用 Python 抓取 Google 地图数据

最后更新于 April 30, 2026

如果你曾经想过搭建一份精准的销售名单、开拓新市场,或者对标竞争对手,你一定知道 Google 地图有多像一座数据金矿。问题在于:随着每月超过 15 亿次“附近”搜索,以及 76% 的本地搜索用户会在 24 小时内到店),市场对最新、基于位置的商业数据需求从来没有这么强烈。

无论你做的是销售、营销还是运营,从 Google 地图提取结构化数据,都可能决定你拿到的是冷冰冰的陌生电话,还是高转化的温热线索。

我在 SaaS 和自动化领域工作多年,也亲眼见过团队如何借助 Python(以及现在的 AI 工具,比如 )把 Google 地图变成战略资产。

在这篇指南里,我会一步一步拆解如何在 2026 年用 Python 抓取 Google 地图数据——包含代码、合规建议,以及和无代码方案的对比。不管你是 Python 老手,还是只想最快拿到可用数据,这里都能帮到你。

用 Python 抓取 Google 地图,究竟是什么意思?

先从最基础的概念说起:用 Python 抓取 Google 地图,就是通过程序化方式从 Google 地图中提取商家信息——比如名称、地址、评分、评论、电话号码和坐标等——这样你就可以分析、筛选并导出,用于业务场景。

城市数据与平板连接示意图

主要有两种做法:

  1. Google Maps Places API:这是官方授权的方式。你用 API 密钥向 Google 服务器发起查询,返回结构化的 JSON 数据。它稳定、可预测,而且在大多数情况下是合规的,但会有配额和费用。
  2. 抓取 HTML 页面:你用浏览器自动化工具(比如 Playwright 或 Selenium)打开 Google 地图,执行搜索,再解析渲染后的页面。这种方式更灵活,但也更脆弱——Google 经常改网站结构,抓取 HTML 还可能违反其条款。

你通常可以提取的数据字段包括:

  • 商家名称
  • 类别/类型
  • 完整地址(含城市、州/省、邮编、国家)
  • 纬度和经度
  • 电话号码
  • 网站 URL
  • 评分和评论数
  • 价格等级
  • 商家状态(营业/歇业)
  • 营业时间
  • Place ID(Google 的唯一标识)
  • Google 地图 URL

**为什么这很重要?**因为这些字段能支撑从线索挖掘、区域规划,到竞争对手对标和市场研究的几乎所有工作。关键在于:要围绕你的业务目标去抓数据,而不是盲目采集。

为什么销售和营销团队会用 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

这些库分别做什么:

  • requestshttpx:HTTP 请求(API 调用)
  • beautifulsoup4lxml:HTML 解析(用于网页抓取)
  • pandas:数据清洗、分析、导出
  • seleniumplaywright:浏览器自动化(用于 HTML 抓取)
  • googlemapsgoogle-maps-places:Google 地图 API 客户端
  • scheduleAPScheduler:任务调度
  • python-dotenv:从 .env 文件安全加载 API 密钥
  • tenacity:错误处理的重试逻辑

2. 获取 Google Maps API 密钥(用于基于 API 的抓取)

  • 前往
  • 创建或选择一个项目。
  • 启用计费(即使是免费额度也需要)。
  • APIs & Services > Library 中启用 “Places API (New)”。
  • 进入 Credentials > Create Credentials > API Key
  • 为安全起见,将密钥限制为特定 API 和 IP。
  • 把 API 密钥存到 .env 文件中(千万不要直接提交到代码仓库):
1GOOGLE_MAPS_API_KEY=your_actual_api_key_here

**注意:**截至 2025 年 3 月,Google 已不再提供统一的每月 200 美元免费额度。现在改为按不同 API 层级提供每月免费阈值(见)。

如何用 Python 从 Google 地图提取数据:分步指南

下面我们把两种主流方式——基于 APIHTML 抓取——拆开讲,方便你选择最适合自己的方案。

方案 1:使用 Google Maps Places API(推荐)

步骤 1:安装并导入所需库

1import os
2import httpx
3import pandas as pd
4from dotenv import load_dotenv

步骤 2:安全加载 API 密钥

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("布鲁克林的咖啡店", 40.6782, -73.9442))
2df.to_csv("brooklyn_coffee_shops.csv", index=False)

专业建议:

  • 一定要设置 X-Goog-FieldMask 请求头来控制成本。如果你请求评论或图片,每 1,000 次请求的价格可能会从 5 美元飙升到 25 美元(见)。
  • 使用服务端筛选(例如 minRatingincludedTypelocationBias),避免把额度浪费在无关结果上。
  • 缓存 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="搜索"]')
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 类名,所以这段代码可能需要定期更新。
  • 使用接近真人的延迟,并避免过快抓取,以降低被封禁的风险。
  • 千万不要尝试绕过验证码或 Google 的 SearchGuard 系统——这可能带来法律风险。

不要盲目抓取:如何精准锁定你真正需要的数据

什么都抓,通常只会浪费时间,还会把数据集搞得臃肿。下面是如何只抓真正有价值的数据

  • 先生成精准的 URL 列表:先用 Google 地图自带的搜索过滤器(类别、位置、评分、当前营业)缩小结果范围,再开始抓取。
  • 使用短语匹配:搜索具体的商家类型或关键词(例如 “奥斯汀的纯素烘焙店”)。
  • 位置过滤:指定城市、街区,甚至坐标和半径,实现更精确的定位。
  • 服务端筛选(API):在 API 请求体中使用 minRatingincludedTypelocationBias
  • 客户端筛选(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:AI 驱动的 Python Google 地图爬虫替代方案

如果你此刻在想:“为了一个简单的线索名单,这套准备工作是不是太多了?”你不是一个人。我们正是因为这个问题,才做了 ——一款 AI 驱动、无需代码的网页爬虫,让你像点几下鼠标一样轻松提取 Google 地图数据(以及更多数据)。

为什么选 Thunderbit?

  • 无需编程或 API 密钥:只要打开 ,进入 Google 地图,然后点击“AI 智能推荐字段”。
  • AI 字段识别:Thunderbit 的 AI 会读取页面并自动建议合适的列——名称、地址、评分、电话、网站等等。
  • 子页面抓取:如果你想把每个商家网站上的信息补充到表格里,Thunderbit 可以自动访问每个子页面并提取额外信息。
  • 导出到 Excel、Google Sheets、Airtable 或 Notion:不用再折腾 pandas,直接点“导出”,数据就能给团队使用。
  • 定时抓取:设置周期性任务,自动监控竞争对手或刷新线索名单。
  • 零维护:Thunderbit 的 AI 会自动适应网站变化,你不用反复修补失效脚本。

Google 地图餐厅爬虫示意图

Thunderbit 与 Python 工作流对比:

步骤Python 爬虫Thunderbit
安装工具30–60 分钟(Python、pip、各类库)2 分钟(Chrome 扩展)
API 密钥设置10–30 分钟(Cloud Console)不需要
字段选择手写代码、字段掩码AI 智能推荐字段(1 次点击)
数据提取编写/运行脚本,处理错误点击“抓取”
导出用 pandas 导出 CSV/Excel导出到 Excel/Sheets/Notion
维护网站变更时手动更新AI 自动适配

**额外福利:**Thunderbit 已经受到全球超过 信任,免费套餐可免费抓取最多 6 个页面(试用加成后可达 10 个)。

保持合规:Google 地图服务条款与抓取伦理

这部分往往是很多 Python 教程最容易过时、也最危险的地方。2026 年你需要知道这些:

  • Google Maps Platform ToS §3.2.3 明确禁止通过官方 API 以外的方式抓取、缓存或导出数据()。唯一例外是:经纬度值最多可缓存 30 天;Place ID 可无限期保存。
  • API 用户受合同约束:如果你使用了 API 密钥,就等于接受了 Google 的条款——即使你抓的是公开数据。
  • 绕过技术限制(验证码、SearchGuard) 现在可能触发 DMCA §1201 违规,并可能带来刑事处罚()。
  • GDPR 和隐私法:如果你从 Google 地图收集个人数据(邮箱、电话、评论者姓名等),你必须有合法依据,并尊重删除请求。法国 CNIL 曾在 2024 年因抓取 LinkedIn 联系人而对 KASPR 罚款 20 万欧元()。
  • 最佳实践:
    • 尽量优先使用 Places API。
    • 限制请求频率(API ≤10 QPS,HTML 抓取每秒 1–2 次)。
    • 绝不绕过验证码或技术封锁。
    • 不要再分发抓取到的个人数据。
    • 尊重退订和删除请求。
    • 始终检查当地法律——GDPR、CCPA 等都在被积极执行。

**结论:**如果你担心合规,最好坚持使用 API,并尽量减少采集的数据。对大多数业务用户来说,像 Thunderbit 这样的无代码工具可以显著降低风险面(无需 API 密钥,也没有再分发风险)。

用 Python 对 Google 地图抓取进行定时与自动化

如果你需要保持数据新鲜——比如每周监控竞争对手,或每月更新线索名单——自动化就是你的好帮手。

使用 schedule 做简单调度

1import schedule, time
2from my_scraper import run_job
3schedule.every().day.at("03:00").do(run_job, query="布鲁克林的餐厅")
4schedule.every(6).hours.do(run_job, query="曼哈顿的咖啡店")
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": "布鲁克林的餐厅"},
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 密钥,并受配额和费用约束。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 密钥或维护,就能提取 Google 地图数据(以及更多内容)。它非常适合需要快速、稳定导出到 Excel、Google Sheets、Airtable 或 Notion 的销售和营销团队。对需要自定义逻辑的技术用户来说,Python 更灵活,但也需要更多配置和合规管理。

5. 我怎么自动化定期提取 Google 地图数据?

使用 Python 时,可以用 scheduleAPScheduler 这类调度库,按固定间隔(每天、每周等)运行爬虫。记得加入随机抖动,避免被识别,并监控 API 配额。使用 Thunderbit 时,你可以直接在界面里设置周期性抓取——无需代码,也不用服务器配置。

准备好把 Google 地图变成你的销售和营销超级武器了吗?无论你是 Python 爱好者,还是想要最快的无代码方案,2026 年你都已经有了现成工具。试试 ,体验即时的 AI 驱动抓取——或者直接卷起袖子,深入 API 世界。无论哪种方式,愿你的线索名单保持新鲜、导出干净利落,营销活动里满是高转化的本地潜客。祝你抓取顺利!

了解更多

Ke
Ke
Thunderbit 首席技术官。Ke 是数据变得一团糟时,大家第一个会去找的人。他的职业生涯一直在把枯燥、重复的工作,变成悄无声息却一直运转的小自动化。要是你曾希望电子表格能自己填好,Ke 可能已经把那个东西做出来了。
Topics
用 Python 抓取 Google 地图Python Google 地图爬虫用 Python 从 Google 地图提取数据
目录

试试 Thunderbit

只需 2 次点击即可抓取线索和其他数据。由 AI 驱动。

获取 Thunderbit 免费试用
使用 AI 提取数据
轻松将数据转移到 Google Sheets、Airtable 或 Notion
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week