PythonでGoogleマップのデータをスクレイピングする方法

最終更新日 April 17, 2026

ターゲットをしぼった営業リストを作りたい、新しい市場を開拓したい、競合をベンチマークしたい——そんなときに頼りになる宝庫が Google Maps です。しかも、毎月 15億回以上の「近くの」検索 があり、ローカル検索ユーザーの76%が24時間以内に店舗を訪問する)ことを考えると、最新の位置情報ベースのビジネスデータへの需要は、これまでになく高まっています。

営業、マーケティング、オペレーションのどの立場でも、Google Maps から構造化データを抽出できれば、ただの“冷たい”テレアポと、反応率の高い“温かい”見込み客の差を生み出せます。

私は SaaS と自動化の分野で長年仕事をしてきましたが、チームが Python(そして今では のような AI 搭載ツール)を使って Google Maps を戦略資産に変えていく様子を、何度も見てきました。このガイドでは、2026年に Python で Google Maps データをスクレイピングする方法を、コード、コンプライアンス上の注意点、ノーコード手法との比較まで含めて、ステップごとに解説します。Python をしっかり使いこなしたい人も、最短で実用データを手に入れたい人も、ぜひ参考にしてください。

PythonでGoogle Mapsをスクレイピングするとは?

まずは基本を押さえましょう。PythonでGoogle Mapsをスクレイピングするとは、Google Maps 上のビジネス情報——たとえば名称、住所、評価、レビュー、電話番号、座標など——をプログラムで抽出し、分析・絞り込み・エクスポートして業務に活かせるようにすることです。

city-data-tablet-connection.webp

主な方法は2つあります。

  1. Google Maps Places API: 公式に認められた方法です。APIキーを使って Google のサーバーに問い合わせ、構造化された JSON データを取得します。安定していて予測しやすく、(おおむね)規約にも沿っていますが、利用上限とコストがあります。
  2. HTML を Web スクレイピングする方法: Playwright や Selenium のようなツールでブラウザを自動操作し、Google Maps を開いて検索結果ページを解析します。柔軟性は高いものの壊れやすく、Google はサイト構造を頻繁に変えるため、HTML スクレイピングは利用規約に抵触する可能性があります。

よく抽出されるデータ項目:

  • 事業者名
  • カテゴリ / 種別
  • 完全な住所(市、州、郵便番号、国を含む)
  • 緯度・経度
  • 電話番号
  • वेबसाइट URL
  • 評価とレビュー数
  • 価格帯
  • 営業状態(営業中 / 休業中)
  • 営業時間
  • Place ID(Google の一意識別子)
  • Google Maps の URL

なぜ大事なのか? これらの項目は、リード獲得、営業エリア設計、競合比較、市場調査など、あらゆる施策の土台になるからです。大切なのは、目的に合ったデータだけを狙うこと。闇雲に全部集める必要はありません。

なぜ営業・マーケティングチームはPythonでGoogle Mapsからデータを抽出するのか

もう少し実践寄りに見ていきましょう。2026年に、なぜ多くの営業・マーケティングチームが Google Maps データに注目しているのでしょうか?

  • リード獲得: 連絡先や評価付きで、地域の事業者を高精度に絞り込んだリストを作り、営業施策に活用できます。
  • 営業エリア設計: 実際の事業密度や業種をもとに、営業圏、配送エリア、サービス範囲を設計できます。
  • 競合モニタリング: 競合の所在地、評価、レビューの推移を追い、傾向やチャンスを見つけられます。
  • 市場調査: 業種、営業時間、レビューの傾向を分析し、Go-to-Market 戦略の材料にできます。
  • 出店候補地の選定: 不動産や小売では、周辺施設、人流、競合状況を踏まえて候補地を評価できます。

実際のインパクト: によると、92%の営業組織が AI/データ投資を拡大する予定であり、地域特化データを使うチームは、一般的なコールドリストに頼るチームより 最大8倍高いコンバージョン率 を記録しています()。あるフランチャイズのリード獲得調査では、Google Maps ベースのリストに投じた 1ドルあたり15ドルの新規売上 が生まれたと報告されています。

ビジネス目標と Google Maps の項目の対応表:

ビジネス目標必要な Google Maps 項目
地域のリードリスト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 (then enrich as needed)

PythonでGoogle Mapsスクレイパーを準備する:ツールと要件

スクレイピングを始める前に、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 解析(Web スクレイピング用)
  • pandas: データの整形、分析、出力
  • selenium, playwright: ブラウザ自動操作(HTML スクレイピング用)
  • googlemaps, google-maps-places: Google Maps API クライアント
  • schedule, APScheduler: タスクスケジューリング
  • python-dotenv: .env ファイルから API キーを安全に読み込む
  • tenacity: エラー処理のためのリトライ制御

2. Google Maps APIキーを取得する(APIベースのスクレイピング用)

  • にアクセスします。
  • プロジェクトを新規作成するか、既存のものを選びます。
  • 課金を有効化します(無料枠でも必要です)。
  • APIs & Services > Library で “Places API (New)” を有効にします。
  • Credentials > Create Credentials > API Key から API キーを作成します。
  • セキュリティのため、特定の API と IP に制限をかけます。
  • API キーは .env ファイルに保存し、コードへ直書きしないでください。
1GOOGLE_MAPS_API_KEY=your_actual_api_key_here

注意: 2025年3月時点で、Google は月額一律 $200 の無料クレジットを提供していません。代わりに、API ティアごとに月間の無料利用上限があります( を参照)。

PythonでGoogle Mapsからデータを抽出する方法:ステップバイステップ

ここでは、API ベースHTML スクレイピング の2つの主要アプローチを順に見ていきます。目的に合った方法を選びましょう。

方法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("coffee shops in Brooklyn", 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 MapsのHTMLをWebスクレイピングする(学習用・単発向け)

注意: Google Maps はシングルページアプリです。ブラウザ自動化(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 クラスをランダム化するため、このコードは定期的に更新が必要になる場合があります。
  • 人間らしい間隔を入れ、短時間に大量アクセスしないことでブロックされるリスクを下げられます。
  • CAPTCHAs や Google の SearchGuard を回避しようとしないでください。法的リスクにつながる可能性があります。

やみくもにスクレイピングしない:必要なデータを正確に絞り込む方法

全部を集めると、時間の無駄とデータの肥大化を招きます。ここでは、本当に必要なデータだけを狙う方法 を紹介します。

  • ターゲット URL のリストを作る: Google Maps の検索フィルター(カテゴリ、場所、評価、営業中など)を使って、対象を絞ってからスクレイピングします。
  • フレーズ一致を活用する: “vegan bakery in Austin” のように、事業種別やキーワードを正確に検索します。
  • ロケーションフィルターを使う: 市区町村、エリア名、または座標と半径を指定して、狙った範囲だけを取得します。
  • サーバー側フィルタリング(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 Mapsデータを整理・出力する

データを取得したら、チームで使えるように整形・分析・出力していきます。

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 Mapsスクレイパーに代わるAI活用型の選択肢

ここまで読んで、「ちょっとしたリードリストのために、設定が多すぎる」と感じた人もいるはずです。だからこそ私たちは を作りました。AI 搭載のノーコード Web スクレイパーなら、Google Maps のデータ抽出が数クリックで終わります。

Thunderbitが選ばれる理由

  • コーディングもAPIキーも不要: を開いて Google Maps に移動し、“AI Suggest Fields” をクリックするだけ。
  • AIによる項目検出: Thunderbit の AI がページを読み取り、name、address、rating、phone、website など適切な列を提案します。
  • サブページのスクレイピング: 各事業者サイトから情報を補完したい場合も、Thunderbit が各サブページを巡回して追加情報を自動取得します。
  • Excel、Google Sheets、Airtable、Notion に出力: pandas の面倒な整形は不要。Export を押すだけで、チームで使える状態になります。
  • 定期スクレイピング: 競合監視やリードリスト更新を自動化する定期実行が可能です。
  • メンテナンス不要: サイト変更にも AI が追従するので、壊れたスクリプトを直し続ける必要がありません。

google-maps-restaurant-scraper.webp

Thunderbit と Python のワークフロー比較:

ステップPythonスクレイパーThunderbit
ツールの導入30〜60分(Python, pip, 各種ライブラリ)2分(Chrome拡張)
APIキー設定10〜30分(Cloud Console)不要
抽出項目の選定手動コード、フィールドマスクAI Suggest Fields(1クリック)
データ抽出スクリプト作成・実行、エラー対応“Scrape” をクリック
出力pandas で CSV/ExcelExcel/Sheets/Notion にエクスポート
保守サイト変更ごとに手動更新AI が自動で適応

おまけ: Thunderbit は世界中で に信頼されており、無料プランでは 6ページまで(トライアル特典で 10ページまで)無償でスクレイピングできます。

コンプライアンスを守る:Google Mapsの利用規約とスクレイピング倫理

ここが、多くの Python チュートリアルが古くなってしまっているポイントです。2026年に知っておくべきことは次の通りです。

  • Google Maps Platform の利用規約 §3.2.3 では、公式 API 以外でのスクレイピング、キャッシュ、エクスポートが厳しく禁止されています()。例外は、緯度・経度の値は最大30日間キャッシュ可能、Place ID は無期限保存可能な点です。
  • API 利用者は契約上の制約を受ける: API キーを使う時点で、公開データだけを対象にしていても Google の規約に同意したことになります。
  • 技術的な障壁(CAPTCHA、SearchGuard)を回避する行為 は、現在 DMCA §1201 違反の可能性があり、刑事罰につながることもあります()。
  • GDPR とプライバシー法: Google Maps から個人データ(メール、電話番号、レビュー投稿者名など)を取得する場合は、法的根拠が必要で、削除要求にも対応しなければなりません。フランスの CNIL は、LinkedIn 連絡先をスクレイピングした KASPR に 2024年、20万ユーロの制裁金を科しました()。
  • ベストプラクティス:
    • 可能な限り Places API を使う
    • リクエストをレート制限する(API は ≤10 QPS、HTML スクレイピングは 1〜2 req/s)
    • CAPTCHA や技術的ブロックを回避しない
    • スクレイピングした個人データを再配布しない
    • オプトアウトや削除要求に対応する
    • GDPR、CCPA など、適用される現地法を必ず確認する

結論: コンプライアンスが気になるなら、API に寄せて収集データを最小限にしましょう。多くのビジネスユーザーにとっては、Thunderbit のようなノーコードツールを使うことでリスクを大きく減らせます(APIキー不要、再配布の心配も少ない)。

PythonでGoogle Mapsスクレイピングを定期実行・自動化する

週次の競合監視や月次のリードリスト更新のように、データを常に最新に保ちたいなら、自動化が味方です。

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秒あたり1〜2リクエストを超えない
  • API 利用時は、利用上限を監視し、課金アラートを設定する
  • エラーを必ず記録し、失敗リクエスト用の「dead-letter」ファイルを残す

Thunderbit の利点: Thunderbit なら、UI から直接、定期スクレイピングを設定できます。コードも cron もサーバー設定も不要です。

重要ポイントまとめ:効率的で、的確で、コンプライアンスに沿った Google Maps データ抽出

要点を振り返りましょう。

  • Google Maps は、ビジネスの位置情報データの第一 स्रोतであり、リード獲得から市場調査まで幅広く支えています。
  • Python スクレイピングは柔軟性と制御性に優れる一方、特に Google のボット対策や法的対応が厳しくなる中で、セットアップ・保守・コンプライアンスの負担があります。
  • API ベースの抽出は、ほとんどのチームにとって最も安全でスケーラブルです。コスト管理のために、必ずフィールドマスクとサーバー側フィルターを使いましょう。
  • HTML スクレイピングは壊れやすくリスクが高いため、単発の調査に限定し、技術的な障壁は絶対に回避しないでください。
  • データは狙いを絞る: フレーズ一致、位置フィルター、pandas のワークフローで必要な情報だけを抽出しましょう。
  • 非エンジニアに最速なのは Thunderbit: AI 搭載、セットアップ不要、即エクスポート、定期実行も標準搭載です。
  • コンプライアンスは重要: Google の規約、プライバシー法、レート制限を守って、面倒なトラブルを避けましょう。

さらに学びたい方は、 もチェックしてみてください。

FAQ

1. 2026年に Python で Google Maps データをスクレイピングするのは合法ですか?

公式 API を使い、Google の規約の範囲内で、利用上限を守り、制限のあるデータを再配布しないのであれば、Google Maps のスクレイピングは許可されています。いっぽうで、Google Maps の HTML スクレイピングは利用規約で明確に禁止されており、特に技術的な障壁を回避したり、同意なく個人データを取得したりすると法的リスクがあります。GDPR、CCPA など現地法を必ず確認し、コンプライアンスのベストプラクティスに従ってください。

2. Google Maps API を使うのと、HTML を Web スクレイピングするのは何が違いますか?

API は安定していて、正式に認可されたデータ抽出手段ですが、APIキーが必要で、利用上限と費用があります。HTML スクレイピングは、ブラウザ自動操作でレンダリング後のページからデータを抜き出しますが、壊れやすく(サイト構造が頻繁に変わる)、規約違反のリスクがあり、法的にも不利です。多くの業務用途では API が推奨されます。

3. 2026年に Python で Google Maps からデータを抽出すると、いくらかかりますか?

Google の Places API は 1,000リクエスト単位の従量課金で、取得する項目に応じて Essentials の $5 から Enterprise+Atmosphere の $25 まで幅があります。月ごとの無料枠(Essentials 10,000、Pro 5,000、Enterprise 1,000 など)はありますが、大規模抽出ではすぐに費用が膨らみます。コスト管理には、必ずフィールドマスクとサーバー側フィルターを使いましょう。

4. Thunderbit は Python ベースの Google Maps スクレイパーと比べてどうですか?

Thunderbit はノーコードの AI 搭載 Web スクレイパーで、プログラミングや APIキー、保守なしで Google Maps データを抽出できます。Excel、Google Sheets、Airtable、Notion にすばやく安定して出力したい営業・マーケティングチームに最適です。独自ロジックが必要な技術者には Python の方が柔軟ですが、その分セットアップとコンプライアンス管理が必要になります。

5. 定期的な Google Maps データ抽出はどう自動化すればいいですか?

Python なら scheduleAPScheduler のようなスケジューリングライブラリを使って、毎日・毎週など決まった間隔でスクレイパーを実行できます。検知を避けるためにランダムな揺らぎを加え、API の利用上限も監視しましょう。Thunderbit なら、UI から直接定期スクレイピングを設定できます。コードもサーバー設定も不要です。

Google Maps を営業・マーケティングの強力な武器に変えたいですか? 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