如何使用 Python 抓取 Google 地图数据

最后更新于 April 17, 2026

如果你曾经想过要搭建一份精准的销售名单、开拓新市场,或者做竞品对标,你一定知道 Google 地图有多像一座数据金矿。更关键的是,每月有超过 15 亿次“附近”搜索,而且 76% 的本地搜索用户会在 24 小时内到店),这也让大家对最新、基于地理位置的商家数据需求只增不减。

不管你做的是销售、营销还是运营,只要能从 Google 地图提取结构化数据,结果可能就完全不同:你拿到的究竟是冷冰冰的陌生开发名单,还是更容易成交的高意向线索。

我在 SaaS 和自动化领域做了很多年,亲眼见过团队怎么借助 Python(以及现在像 这样的 AI 工具)把 Google 地图变成战略资产。在这篇指南里,我会手把手拆解 2026 年如何用 Python 抓取 Google 地图数据——包括代码、合规建议,以及和无代码方案的对比。无论你是 Python 老手,还是只想尽快拿到能用的数据,这篇文章都适合你。

用 Python 抓取 Google 地图到底是什么意思?

先从最基础的说起:用 Python 抓取 Google 地图,就是通过程序自动提取商家信息——比如名称、地址、评分、评论、电话号码和坐标——然后拿去做分析、筛选,并导出到业务系统里。

city-data-tablet-connection.webp

主要有两种实现方式:

  1. Google Maps Places API:这是官方授权的做法。你通过 API key 向 Google 服务器发起查询,拿到结构化 JSON 数据。它稳定、可预测,而且大多数情况下也更合规,但会受配额和费用限制。
  2. 抓取网页 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 key
  • tenacity:重试与错误处理

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 美元(见 )。
  • 使用服务端过滤条件(如 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="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 请求体中使用 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:面向 Python Google 地图爬虫的 AI 方案

如果你心里正在想:“就为了做一份线索名单,前置配置也太多了吧”,那你并不孤单。这也是我们打造 的原因——一款 AI 驱动、无需代码的网页爬虫,让抓取 Google 地图数据(以及更多内容)变成点几下就能完成的事。

为什么选择 Thunderbit?

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

google-maps-restaurant-scraper.webp

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,可以借助 scheduleAPScheduler 这类调度库,按日、按周等固定间隔运行爬虫。为了避免被识别,建议加入随机抖动,并持续监控 API 配额。使用 Thunderbit 时,你可以直接在界面里设置周期性抓取——无需代码,也不用搭建服务器。

准备好把 Google 地图变成你的销售和营销超级武器了吗?无论你是 Python 爱好者,还是想找最快的无代码方案,2026 年都有成熟工具可用。试试 ,体验即开即用的 AI 抓取;或者直接上手 API 方案。无论哪种方式,祝你的线索名单永远最新、导出始终干净、营销活动都能触达高转化本地客户。祝你抓取顺利!

了解更多

Ke
Ke
CTO @ Thunderbit. Ke is the person everyone pings when data gets messy. He's spent his career turning tedious, repetitive work into quiet little automations that just run. If you've ever wished a spreadsheet could fill itself in, Ke has probably already built the thing that does it.
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