毎月15億件を超える「近くの○○」という検索がGoogleで走っている——この数字から話を始めましょう。しかもローカル検索をした人の76%は、24時間以内に実際の店舗まで足を運ぶ(thinkwithgoogle.com)。つまり位置情報つきの最新ビジネスデータは、いま取り合いになっているわけです。営業リストを精度高く組みたい、未開拓の地域を攻めたい、競合の出店状況を測りたい——どの動機であっても、Googleマップが一級の情報源だという点は変わりません。
ここに構造化データという形で手を入れられれば、温度の低いコールドコールが、見込みの高い「温かい」リードに化けることもあるんです。立場が営業でもマーケティングでもオペレーションでも、この恩恵は同じように効いてきます。
私はSaaSと自動化の周辺でずっと食べてきましたが、Python、そして最近ではThunderbitのようなAI搭載ツールを武器に、チームがGoogleマップを戦略資産へと作り替えていく場面を、数えきれないほど目にしてきました。
このガイドが扱うのは、2026年にPythonでGoogleマップのデータを取得する具体的な手順です。コードはもちろん、コンプライアンス上の落とし穴、そしてノーコードという別ルートとの比較まで、順を追って整理していきます。Pythonに手慣れた方も、とにかく最短で使えるデータが欲しい方も、最後までお付き合いください。
PythonでGoogleマップをスクレイピングするとはどういうことか?
最初に土台を固めておきます。プログラムから店舗の名前・住所・評価・レビュー・電話番号・座標といった情報を取り出し、分析や絞り込み、書き出しを通じて業務に回せる状態にする——これがPythonでGoogleマップをスクレイピングするという作業の中身です。

やり方は大きく分けて2通りあります。
- Googleマップ Places API:公式にライセンスされたルートです。APIキーでGoogleのサーバーに問い合わせ、整った形のJSONを受け取ります。挙動が安定して読みやすく、規約にも基本的に沿っていますが、利用枠と費用という代償がつきます。
- HTMLをWebスクレイピングする方法:PlaywrightやSeleniumでブラウザを動かし、Googleマップを開いて検索し、描画されたページを解析します。自由は利くものの、Googleは頻繁に構造を入れ替えるため壊れやすく、しかもHTMLの直接取得はGoogleの規約に触れるおそれがあります。
よく抽出されるデータ項目:
- 店舗名
- カテゴリ/業種
- 住所全体(市、州、郵便番号、国を含む)
- 緯度・経度
- 電話番号
- WebサイトURL
- 評価とレビュー数
- 価格帯
- 営業状態(営業中/閉業)
- 営業時間
- Place ID(Google独自の識別子)
- GoogleマップURL
なぜ重要なのか? 競合比較や市場調査、リード獲得、営業エリアの線引き——こうした幅広い実務を、いま挙げた項目が下支えします。肝心なのはビジネス目標に紐づくデータだけを狙うこと。手当たり次第に集めるのは、やめておきましょう。
営業・マーケティングチームがPythonでGoogleマップのデータを抽出する理由
ここからは実務寄りの話です。2026年の営業・マーケティング部門が、これほどGoogleマップのデータに目を向けているのはなぜなのでしょう。
- リード獲得:連絡先や評価まで揃った地域企業のリストを組み、アウトリーチに直接つなげられます。
- エリア設計:事業の密度や業種の分布という実データをもとに、営業区域や配送圏、サービス範囲を地図上で描けます。
- 競合モニタリング:競合の所在地・評価・レビューを時系列で追いかけ、潮目や機会を読み取れます。
- 市場調査:業種や営業時間、レビューに表れた感情を分析し、Go-to-Market戦略へ落とし込めます。
- 出店候補地の選定:不動産や小売なら、周辺施設・人通り・競合の状況を見ながら候補地を品定めできます。
実際のインパクト: 地域特化データを使うチームは、ありふれたコールドリストに頼る場合と比べて成約率が最大8倍に届くといいます(martal.ca)。背景には、営業組織の92%がAI/データへの投資拡大を見込んでいるというHubSpot 2025 State of Salesの数字もあります。あるフランチャイズのリード獲得調査では、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以上。
主要ライブラリをインストール:
pip install \
requests==2.33.1 httpx==0.28.1 \
beautifulsoup4==4.14.3 lxml==6.0.3 \
pandas==2.3.3 \
selenium==4.43.0 playwright==1.58.0 \
googlemaps==4.10.0 google-maps-places==0.8.0 \
schedule==1.2.2 APScheduler==3.11.2 \
python-dotenv==1.2.2 tenacity==9.1.4
playwright install chromium
各ライブラリの役割:
requests,httpx:HTTPリクエスト(API呼び出し)beautifulsoup4,lxml:HTML解析(Webスクレイピング用)pandas:データの整形、分析、出力selenium,playwright:ブラウザ自動化(HTMLスクレイピング用)googlemaps,google-maps-places:GoogleマップAPIクライアントschedule,APScheduler:タスクのスケジューリングpython-dotenv:.envファイルからAPIキーを安全に読み込むtenacity:エラー処理のためのリトライロジック
2. GoogleマップのAPIキーを取得する(APIベースのスクレイピング用)
- Google Cloud Console にアクセスします。
- プロジェクトを作成または選択します。
- 課金を有効にします(無料枠でも必要です)。
- APIs & Services > Library で「Places API (New)」を有効にします。
- Credentials > Create Credentials > API Key に進みます。
- セキュリティのため、特定のAPIとIPにキーを制限します。
- APIキーは
.envファイルに保存します(コードに直接コミットしないでください)。
GOOGLE_MAPS_API_KEY=your_actual_api_key_here
注: かつてあった月200ドル分の一律無料クレジットは、2025年3月をもって廃止されました。いまはAPIの階層ごとに、月単位の無料しきい値が個別に決められています(公式料金を参照)。
PythonでGoogleマップからデータを抽出する方法:ステップごとのガイド
ここからはAPIベースとHTMLスクレイピングという2本柱を、それぞれ順番に追っていきます。自分の用途にしっくりくる方を選んでください。
アプローチ1:Googleマップ Places API を使う(推奨)
STEP 1: 必要なライブラリをインストールして読み込む
import os
import httpx
import pandas as pd
from dotenv import load_dotenv
STEP 2: APIキーを安全に読み込む
load_dotenv()
API_KEY = os.environ["GOOGLE_MAPS_API_KEY"]
STEP 3: 検索クエリを作成する
Text Search エンドポイントを使って、条件に合う店舗を探します。
URL = "https://places.googleapis.com/v1/places:searchText"
FIELD_MASK = ",".join([
"places.id", "places.displayName", "places.formattedAddress",
"places.location", "places.rating", "places.userRatingCount",
"places.priceLevel", "places.types",
"places.nationalPhoneNumber", "places.websiteUri",
"nextPageToken",
])
STEP 4: APIリクエストを送信する
def text_search(query, lat, lng, radius=3000, min_rating=4.0):
body = {
"textQuery": query,
"minRating": min_rating, # サーバー側フィルター
"includedType": "restaurant",
"openNow": False,
"pageSize": 20,
"locationBias": {
"circle": {
"center": {"latitude": lat, "longitude": lng},
"radius": radius,
}
},
}
headers = {
"Content-Type": "application/json",
"X-Goog-Api-Key": API_KEY,
"X-Goog-FieldMask": FIELD_MASK, # 必ず設定してください
}
r = httpx.post(URL, json=body, headers=headers, timeout=30)
r.raise_for_status()
return r.json()
STEP 5: ページネーションを処理して結果を集める
def collect_all_results(query, lat, lng, radius=3000, min_rating=4.0):
results = []
next_page_token = None
while True:
data = text_search(query, lat, lng, radius, min_rating)
places = data.get('places', [])
results.extend(places)
next_page_token = data.get('nextPageToken')
if not next_page_token:
break
return results
STEP 6: Pandasでデータを書き出す
df = pd.DataFrame(collect_all_results("ブルックリンのコーヒーショップ", 40.6782, -73.9442))
df.to_csv("brooklyn_coffee_shops.csv", index=False)
実践ポイント:
X-Goog-FieldMaskヘッダーの設定は省略禁止です。レビューや写真まで要求すると、1,000リクエストあたりの単価が5ドルから25ドルへ跳ね上がることがあります(料金の詳細)。minRating、includedType、locationBiasといったサーバー側フィルターを噛ませれば、いらない結果にクレジットを溶かさずに済みます。place_idはキャッシュしておきましょう。重複排除にも、後日の更新にも効いてきます。
アプローチ2:GoogleマップのHTMLをWebスクレイピングする(学習用途/単発用途向け)
警告: GoogleマップはシングルページアプリなのでPlaywrightやSeleniumといったブラウザ自動化が前提になり、おまけにHTMLの直接取得はGoogleの規約に反するおそれがあります。あくまで研究のための手段にとどめ、本番運用には持ち込まないでください。
STEP 1: Playwrightをインストールしてブラウザを起動する
from playwright.sync_api import sync_playwright
import time, re
def scrape_maps(query, max_results=100):
with sync_playwright() as pw:
browser = pw.chromium.launch(headless=True)
ctx = browser.new_context(
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",
locale="en-US",
)
page = ctx.new_page()
page.goto("https://www.google.com/maps", timeout=60_000)
page.fill("#searchboxinput", query)
page.click('button[aria-label="Search"]')
page.wait_for_selector('div[role="feed"]')
feed = page.locator('div[role="feed"]')
prev = 0
while True:
feed.evaluate("el => el.scrollBy(0, el.scrollHeight)")
time.sleep(2)
count = page.locator('div[role="feed"] > div > div[jsaction]').count()
if count == prev or count >= max_results:
break
prev = count
if page.locator("text=You've reached the end of the list").count():
break
rows = []
cards = page.locator('div[role="feed"] > div > div[jsaction]')
for i in range(cards.count()):
c = cards.nth(i)
name = c.locator("div.fontHeadlineSmall").inner_text() if c.locator("div.fontHeadlineSmall").count() else ""
rating_el = c.locator('span[role="img"]').first
raw = rating_el.get_attribute("aria-label") if rating_el.count() else ""
m = re.search(r"([\d.]+)\s+stars?\s+([\d,]+)\s+Reviews", raw or "")
rating = float(m.group(1)) if m else None
reviews = int(m.group(2).replace(",", "")) if m else None
rows.append({"name": name, "rating": rating, "reviews": reviews})
browser.close()
return rows
ヒント:
- CSSクラスはGoogleが数週間ごとにランダム化してくるので、このコードもそのたびに手入れが要るかもしれません。
- アクセス間隔は人間らしく空け、速すぎる連続取得は避ける。これだけでブロックされる確率はぐっと下がります。
- CAPTCHAやGoogleのSearchGuardを突破しようとするのは禁物です。法的なリスクを背負い込むことになります。
やみくもなスクレイピングを避ける:必要なデータを的確に絞り込む方法
片っ端から取りに行っても、待っているのは膨れ上がったデータと、無駄に費やした時間だけ。狙いを定めて、本当に要るデータだけを抜く——これが正解です。
- ターゲットを絞ったURLリストを作る:取得に取りかかる前に、Googleマップ側の検索フィルター(カテゴリ・場所・評価・営業中など)で結果を間引いておきます。
- フレーズ一致を使う:「オースティンのヴィーガンベーカリー」のように、業種名やキーワードを正確に指定して検索します。
- 位置情報フィルター:市区町村やエリア名、さらには座標と半径まで絞り込んで、ピンポイントで抜き出します。
- サーバー側フィルタリング(API):APIリクエストの本文に
minRating、includedType、locationBiasを仕込みます。 - クライアント側フィルタリング(Python):取得した後にpandasで、評価4.0以上・レビュー50件超・特定カテゴリといった条件を重ねて絞ります。
例:マンハッタンのレストランのうち、評価4.0以上だけに絞る
df = pd.DataFrame(results)
filtered = df[(df['rating'] >= 4.0) & (df['types'].apply(lambda x: 'restaurant' in x))]
filtered.to_csv("manhattan_top_restaurants.csv", index=False)
PythonライブラリでGoogleマップのデータを整理・書き出しする
データを手にしたら、次はチームで回せるように整形し、分析し、出力していく段階です。
Pandasでデータをクレンジングして構造化する
import pandas as pd
df = pd.read_json("brooklyn_restaurants.json")
df = (
df.dropna(subset=["name", "address"])
.drop_duplicates(subset=["place_id"])
.assign(
name=lambda d: d["name"].str.strip(),
phone=lambda d: d["phone"].astype(str)
.str.replace(r"\D", "", regex=True)
.str.replace(r"^1?(\d{10})$", r"+1\1", regex=True),
rating=lambda d: pd.to_numeric(d["rating"], errors="coerce"),
user_ratings_total=lambda d: pd.to_numeric(
d["user_ratings_total"], errors="coerce"
).fillna(0).astype("int32"),
)
)
データを分析・要約する
例:地域ごとの平均評価
by_neighborhood = (
df.groupby("neighborhood", as_index=False)
.agg(avg_rating=("rating", "mean"),
n_places=("place_id", "nunique"),
median_reviews=("user_ratings_total", "median"))
.sort_values("avg_rating", ascending=False)
)
ExcelまたはCSVに書き出す
df.to_csv("brooklyn_top.csv", index=False)
df.to_excel("brooklyn_top.xlsx", index=False, sheet_name="Top Rated")
大量データなら? 速度とサイズ効率のためにParquet形式を使いましょう。
df.to_parquet("brooklyn_top.parquet", compression="zstd")
Thunderbit:PythonのGoogleマップスクレイパーに代わるAI搭載ソリューション
「ただのリードリストが欲しいだけなのに、ここまで仕込むのは骨が折れる」——そう感じた方もいるでしょう。その引っかかりに応えるために生まれたのがThunderbitです。AIを積んだノーコードのWebスクレイパーで、Googleマップをはじめ多様な情報を、数クリックで取り出せます。
Thunderbitが選ばれる理由
- コーディングもAPIキーも不要:Thunderbit Chrome拡張機能 を立ち上げ、Googleマップを開いて「AIで項目を提案」を押す。たったそれだけです。
- AIによる項目検出:ThunderbitのAIがページを読み解き、名前・住所・評価・電話番号・Webサイトといった列を、適切な形で提案してくれます。
- サブページのスクレイピング:各店舗のWebサイトにある情報まで表に取り込みたいときは、Thunderbitがサブページを一つずつ巡って追加データを自動で集めます。
- Excel、Googleスプレッドシート、Airtable、Notionへ出力:pandasと格闘する日々はもう終わり。「エクスポート」を押せば、チームがすぐに使える形で手元に届きます。
- スケジュールスクレイピング:競合の監視やリードリストの更新を自動で回す、定期ジョブを組めます。
- メンテナンスほぼ不要:ThunderbitのAIはサイトの変化に自分で順応するので、壊れたスクリプトを直し続ける作業から解放されます。

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は世界中で3万人を超えるユーザーに使われており、無料プランでも最大6ページ(トライアル特典があれば10ページ)まではタダで取得できます。
コンプライアンスを守る:Googleマップの利用規約とスクレイピング倫理
ここは、世に出回るPythonチュートリアルが古びやすい領域でもあります。2026年に押さえておくべき要点を並べます。
- Google Maps Platform 利用規約 §3.2.3 は、公式API以外の手段でのスクレイピングやキャッシュ、データの外部持ち出しを厳しく禁じています(cloud.google.com)。ただし例外があり、緯度・経度は30日まで、Place IDは無期限でキャッシュしてかまいません。
- APIユーザーは契約上の拘束を受ける:扱うのが公開データだけであっても、APIキーを使う時点でGoogleの規約に同意したことになります。
- CAPTCHAやSearchGuardといった技術的制限の回避は、いまやDMCA §1201違反として刑事罰の対象になりうる行為です(ppc.land)。
- 個人情報保護法とプライバシー法:メールや電話番号、レビュー投稿者名といった個人データをGoogleマップから集めるなら、法的根拠が要りますし、削除の求めにも応じる義務があります。実際、フランスのCNILは2024年、LinkedInの連絡先をスクレイピングしたKASPRに20万ユーロの制裁金を課しました(edpb.europa.eu)。
- ベストプラクティス:
- 可能な限りPlaces APIを使う。
- リクエストをレート制限する(APIは≤10 QPS、HTMLスクレイピングは1〜2 req/s)。
- CAPTCHAや技術的ブロックを回避しない。
- スクレイピングした個人データを再配布しない。
- オプトアウトや削除の要求に応じる。
- 個人情報保護法、CCPAなど、地域の法律を必ず確認する。
結論: コンプライアンスが気がかりなら、APIを通し、集めるデータは最小限にとどめる——これが一番安全な構えです。多くのビジネスユーザーにとっては、APIキーも再配布も伴わないThunderbitのようなノーコードツールが、リスクを大きく削ってくれます。
PythonでGoogleマップのスクレイピングをスケジュールし、自動化する
週単位の競合チェックや月単位のリードリスト更新——データを鮮度の高いまま保ちたいなら、自動化が頼れる相棒になります。
schedule を使った簡単なスケジューリング
import schedule, time
from my_scraper import run_job
schedule.every().day.at("03:00").do(run_job, query="ブルックリンのレストラン")
schedule.every(6).hours.do(run_job, query="マンハッタンのコーヒーショップ")
while True:
schedule.run_pending()
time.sleep(30)
APScheduler を使った本番向けスケジューリング
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.triggers.cron import CronTrigger
sched = BackgroundScheduler(timezone="America/New_York")
sched.add_job(
run_job,
CronTrigger(hour=3, minute=15, jitter=600), # 午前3:15 ± 10分
kwargs={"query": "ブルックリンのレストラン"},
id="brooklyn_daily",
max_instances=1,
coalesce=True,
misfire_grace_time=3600,
)
sched.start()
安全に自動化するためのヒント
- 動きを読まれないよう、スケジュールにはランダムな揺らぎを混ぜておきましょう。
- HTMLスクレイピングの場合、毎秒1〜2リクエストを上限の目安にします。
- API利用なら、利用枠を見張りつつ、課金アラートを仕掛けておきます。
- エラーは漏らさず記録し、失敗したリクエストは「デッドレター」ファイルに退避させておきましょう。
Thunderbitの便利機能: ThunderbitならUIから直接、定期スクレイピングを組めます。コードもcronジョブもサーバー設定も、一切いりません。
重要なポイント:効率的で、狙いを絞り、コンプライアンスを守ったGoogleマップデータ抽出
ここまでの要点を、ざっとさらっておきます。
- 位置情報ビジネスデータの第一候補はやはりGoogleマップで、リード獲得から市場調査まで広く支えています。
- Pythonによる取得は自由度と制御性に優れる反面、セットアップや保守、コンプライアンスという負荷を背負います。Googleの対ボット策と法的執行が締まっていく流れの中では、なおさらです。
- ほとんどのチームにとって最も安全でスケールするのはAPIベースの抽出です。コストを抑えるには、フィールドマスクとサーバー側フィルターを欠かさずに。
- HTMLスクレイピングは脆くてリスクも高いので、単発の調査に限り、技術的制限の回避には決して手を出さないこと。
- データは絞って取る:フレーズ一致、位置フィルター、pandasの流れを使い、必要な分だけを抜きましょう。
- 非エンジニアにとっての最短経路はThunderbitです。AI搭載でセットアップ不要、すぐエクスポートでき、スケジュール機能まで内蔵しています。
- コンプライアンスは外せません。Googleの規約、プライバシー法、レート制限を守り、法的なつまずきを避けましょう。
さらに踏み込んだチュートリアルやヒントは、Thunderbit Blog と YouTubeチャンネル にそろえてあります。
FAQ
1. 2026年にPythonでGoogleマップのデータをスクレイピングするのは合法ですか?
公式APIを介する取得なら、Googleの規約に沿い、利用枠を守り、制限つきデータを再配布しない限りは認められています。一方、GoogleマップのHTMLスクレイピングは規約で明確に禁じられており、とりわけ技術的制限を回避したり、同意なく個人データを集めたりすれば法的リスクを伴います。GDPRやCCPAなど現地の法律を確認し、コンプライアンスの基本を守ることを忘れずに。
2. GoogleマップAPIを使うのと、HTMLをWebスクレイピングするのは何が違いますか?
APIは安定していてライセンスもあり、データ抽出のために設計されていますが、APIキーが必要で、利用枠と費用がかかります。HTMLスクレイピングはブラウザ自動化で描画済みページからデータを抜く方式で、サイト変更が多く壊れやすいうえ、規約違反になりうるし、法的リスクも高めです。業務用途の多くでは、やはりAPIが推奨されます。
3. 2026年にPythonでGoogleマップのデータを抽出するには、どれくらい費用がかかりますか?
GoogleのPlaces APIは1,000リクエスト単位の従量制で、取得項目次第でEssentialsの5ドルからEnterprise+Atmosphereの25ドルまで開きがあります。月間の無料しきい値(Essentials 10,000、Pro 5,000、Enterprise 1,000)もありますが、大規模に回せば費用はすぐ膨らみます。コスト管理には、フィールドマスクとサーバー側フィルターを常用しましょう。
4. ThunderbitはPythonベースのGoogleマップスクレイパーと比べてどうですか?
ThunderbitはノーコードのAI搭載Webスクレイパーで、プログラミングもAPIキーも保守もなしにGoogleマップのデータを取れます。Excel、Googleスプレッドシート、Airtable、Notionへ速く安定して出したい営業・マーケティングチームにはうってつけです。独自ロジックを組みたい技術者にはPythonのほうが柔軟ですが、その代わり準備やコンプライアンス管理の手間は増えます。
5. 定期的なGoogleマップデータ抽出はどう自動化できますか?
Pythonなら、schedule や APScheduler といったスケジューリングライブラリで、スクレイパーを毎日・毎週といった間隔で回せます。検知を避けるためにランダムな揺らぎを足し、APIの利用枠も見張ってください。Thunderbitの場合は、UIから直接、定期スクレイピングを組めます。コードもサーバー設定も不要です。
Googleマップを営業・マーケティングの武器に仕立てる準備はできましたか? Python派の方も、最速のノーコード手段を探している方も、2026年には選べる道具が出そろっています。AI搭載の即時スクレイピングを味わうなら、いますぐThunderbitを。自分の手でAPIを乗りこなすのも一つの選択です。どちらに進んでも、リードリストは鮮度を保ち、出力はきれいに整い、キャンペーンは成約率の高い地域見込み客で満ちていくはずです。楽しいスクレイピングを!
詳しく知る


