Google Maps Scraper:大規模なオープンソースのリード抽出

CLI、Web UI、REST API、プロキシ対応、メールアドレス抽出、分散スケーリングを備えたGo製Google Mapsスクレイパーを紹介します。

Google Maps Scraper:大規模なオープンソースのリード抽出

構造化されたローカルビジネスデータは、営業見込み客の開拓、市場調査、ローカルSEO、データエンリッチメント、自動化に役立ちます。しかし、Google Mapsのリスティングを手作業でコピーしていては規模を拡大できません。オープンソースの gosom/google-maps-scraper は、Google Mapsの検索結果を、ビジネスの詳細情報、連絡先情報、レビュー、座標、さらにオプションでメールアドレスを含む構造化レコードに変換します。

このプロジェクトはMITライセンスで提供され、スクレイパーを実行する方法として、コマンドラインインターフェース、ローカルWeb UI、REST API、オプションのセルフホスト型SaaSエディション、自然言語ワークフロー向けのAIエージェントスキルを利用できます。主にGoで記述されており、ブラウザベースの抽出にはPlaywrightを使用します。

スクレイパーが収集するデータ

一般的な結果には、次のような33以上のフィールドを含めることができます。

  • ビジネス名、カテゴリ、説明、営業ステータス
  • 番地と完全な整形済み住所
  • 電話番号と公式ウェブサイト
  • Google Mapsリンク、Place ID、CID、その他の識別子
  • 平均評価、レビュー数、評価の内訳、顧客レビュー
  • 緯度、経度、タイムゾーン、Plus Code、Street View URL
  • 営業時間と混雑する時間帯の情報
  • 価格帯、予約、メニュー、オンライン注文のリンク
  • 画像、サムネイル、オーナー確認ステータス、利用可能なクレジットカード、その他のメタデータ
  • ビジネスウェブサイトを任意でクロールして発見したメールアドレス

-extra-reviewsフラグを使用すると、場所ごとに最大約300件のレビューを追加で収集できます。すべてのビジネスウェブサイトを訪問すると実行時間が大幅に増加するため、メールアドレスの抽出はオプトイン方式です。

Dockerでのクイックスタート

ブラウザ自動化環境がイメージに含まれているため、Dockerによるインストールが推奨されます。出力ディレクトリを作成し、1行につき1つのクエリを含む入力ファイルをマウントします。

mkdir -p gmaps-output

docker run \\
  -v gmaps-playwright-cache:/opt \\
  -v "$PWD/example-queries.txt:/queries.txt:ro" \\
  -v "$PWD/gmaps-output:/out" \\
  gosom/google-maps-scraper \\
  -input /queries.txt \\
  -results /out/results.csv \\
  -depth 1 \\
  -exit-on-inactivity 3m

クエリファイルは次のようになります。

restaurants in Berlin
software companies in Austin
coffee shops in Athens

デフォルトの出力形式はCSVです。JSONで書き出すには、-jsonを追加し、結果のパスに.jsonを指定します。

docker run \\
  -v gmaps-playwright-cache:/opt \\
  -v "$PWD/queries.txt:/queries.txt:ro" \\
  -v "$PWD/output:/out" \\
  gosom/google-maps-scraper \\
  -input /queries.txt \\
  -results /out/results.json \\
  -json \\
  -depth 1 \\
  -exit-on-inactivity 3m

初回実行時には、ブラウザライブラリのダウンロードとPlaywrightキャッシュの初期化が行われる場合があります。名前付きDockerボリュームに/optを永続化すると、この処理を繰り返さずに済みます。

3つの利用方法

1. コマンドライン

CLIは、再現性のあるジョブ、シェルスクリプト、cronタスク、データパイプラインに適しています。主なオプションは次のとおりです。

オプション 用途
-input クエリまたはGoogle Maps URLを含む入力ファイル
-results CSV、JSON、JSONLの出力先
-depth 結果のスクロール最大深度。デフォルトは10
-c 同時実行するスクレイプジョブ数。デフォルトはCPUコア数の半分
-email ビジネスウェブサイトをクロールしてメールアドレスを抽出
-extra-reviews 拡張レビュー情報を収集
-resume ファイルベースのスクレイプを中断箇所から再開
-fast-mode クエリごとに最大21件の結果を高速収集
-lang Google Mapsの言語。例:de
-geo 検索座標。例:37.7749,-122.4194
-radius 検索半径(メートル)
-grid-bbox 地理的なバウンディングボックスをセルに分割

2. Web UIとREST API

次のコマンドでローカルWeb UIを起動します。

mkdir -p gmapsdata

docker run \\
  -v "$PWD/gmapsdata:/gmapsdata" \\
  -p 8080:8080 \\
  gosom/google-maps-scraper \\
  -data-folder /gmapsdata

http://localhost:8080を開きます。サーバーはhttp://localhost:8080/api/docsでOpenAPI 3.0.3仕様も公開します。

主なAPIエンドポイントは次のとおりです。

  • POST /api/v1/jobs — スクレイピングジョブを作成
  • GET /api/v1/jobs — ジョブ一覧を取得
  • GET /api/v1/jobs/{id} — ジョブを確認
  • DELETE /api/v1/jobs/{id} — ジョブを削除
  • GET /api/v1/jobs/{id}/download — CSV結果をダウンロード

これにより、社内ダッシュボード、CRMワークフロー、スケジュール実行するリード生成サービスとの統合に適したスクレイパーを構築できます。

3. AIエージェントワークフロー

このリポジトリには、Claude Code、Codex、Cursor、GitHub Copilotなどのツールで利用できるAgent Skillsパッケージが含まれています。次のコマンドでインストールします。

npx skills add gosom/google-maps-scraper

その後、次のような依頼ができます。

ベルリンの歯科医を探し、ウェブサイトとメールアドレスも含めてください。

このスキルは、検索のデフォルト値を推測し、小規模な検証実行を行い、Dockerクロールを開始し、進捗を監視し、結果の保存や分析を支援できます。プロキシ認証情報はエージェントとの会話に貼り付けるのではなく、マスクされたローカルターミナルのプロンプトから入力します。macOS、Linux、またはWSL経由のWindowsでは、DockerとNode.jsが必要です。

大規模ジョブの処理

プロジェクトでは、-c 8 -depth 1の設定で毎分約120か所を処理できると報告されています。ただし、実際のスループットは、クエリの複雑さ、ブラウザリソース、ネットワーク状況、ブロックの有無によって異なります。

代表的な見積もりは次のとおりです。

キーワード数 キーワードあたりの結果数 場所の総数 推定時間
100 16 1,600 約13分
1,000 16 16,000 約2.5時間
10,000 16 160,000 約22時間

同時実行数は、同時に実行するジョブ数を制御します。ブラウザプロセスとページの設定により、さらに細かく制御できます。

./google-maps-scraper \\
  -c 8 \\
  -browser-pool-size 2 \\
  -pages-per-browser 4 \\
  -input queries.txt \\
  -results results.csv \\
  -depth 1

ここでは、8つのジョブが2つのブラウザプロセスに分散され、各ブラウザで4つのタブが使用されます。htopまたはdocker statsでリソース使用量を監視してください。ChromiumはCPUとメモリを大量に消費する場合があります。ワーカーを効率よく稼働させるには、browser-pool-sizepages-per-browserの積が-cとおおむね同じか、それ以上になるように設定します。

中断されたジョブには、再開モードを使用します。

./google-maps-scraper \\
  -resume \\
  -input queries.txt \\
  -results results.csv \\
  -depth 10

再開モードは既存のCSVまたはJSONL出力を読み取り、書き込み済みの場所をスキップします。また、完了した入力クエリを含む<results>.resume.jsonサイドカーファイルを維持します。通常のファイル出力が必要で、標準出力、カスタムライター、LeadsDB出力、fast modeとは互換性がありません。

グリッドスクレイピングによる地理的カバレッジ

1回のGoogle Maps検索では、人口密度の高い地域について十分な結果が得られない場合があります。グリッドスクレイピングでは、バウンディングボックスをセルに分割し、各セルからクエリを実行します。

./google-maps-scraper \\
  -input queries.txt \\
  -results peristeri-cafes.csv \\
  -grid-bbox "38.0077,23.6719,38.0257,23.6947" \\
  -grid-cell 0.5 \\
  -zoom 16 \\
  -depth 1 \\
  -c 4

グリッドモードは地理的なカバレッジの向上に役立ちますが、結果をバウンディングボックス内に厳密に限定するものではありません。厳密な距離フィルタリングには、fast modeで-geo-radiusを使用するか、緯度と経度を使ってレコードを後処理してください。

fast modeはクエリごとに最大21件の結果を距離順で返します。

./google-maps-scraper \\
  -input queries.txt \\
  -results results.csv \\
  -fast-mode \\
  -zoom 15 \\
  -radius 5000 \\
  -geo '37.7749,-122.4194'

fast modeは現在ベータ版で、ブロックの影響を受けやすい可能性があります。-grid-bboxとは併用できません。

プロキシ設定

大規模なジョブでは、プロキシを使用することでトラフィックを分散し、レート制限を軽減できます。対応プロトコルはSOCKS5、SOCKS5H、HTTP、HTTPSです。

./google-maps-scraper \\
  -input queries.txt \\
  -results results.csv \\
  -proxies 'socks5://user:pass@host:port,http://host2:port2' \\
  -depth 1 \\
  -c 2

プロキシURLを1行に1つずつファイルに記述することもできます。

./google-maps-scraper \\
  -input queries.txt \\
  -results results.csv \\
  -proxies-file proxies.txt

プロキシの利用は、責任あるクロール設計の代わりにはなりません。低い同時実行数から始め、小規模なサンプルを検証し、適用される法律およびアクセスするデータに関する規約を遵守してください。

LeadsDBへの直接エクスポート

中間ファイルに書き出す代わりに、スクレイパーからLeadsDBへレコードを直接送信できます。LeadsDBは、重複排除、フィルタリング、APIアクセス、エクスポートを提供します。

export LEADSDB_API_KEY="your-api-key"
./google-maps-scraper \\
  -input queries.txt \\
  -exit-on-inactivity 3m

または、-leadsdb-api-keyでキーを明示的に指定します。Google Mapsのフィールドは、名前、カテゴリ、電話番号、ウェブサイト、住所、座標、評価、レビュー数、メールアドレス、ロゴURL、ソースIDなどのリードフィールドにマッピングされます。その他のMapsメタデータはカスタム属性として保持されます。

PostgreSQLとKubernetesによるスケーリング

分散ワークロードでは、PostgreSQLを共有ジョブプロバイダーとして利用できます。開発用データベースを起動し、ジョブを登録して、複数のマシンでスクレイパーワーカーを実行します。

docker-compose -f docker-compose.dev.yaml up -d

./google-maps-scraper \\
  -dsn "postgres://postgres:postgres@localhost:5432/postgres" \\
  -produce \\
  -input example-queries.txt \\
  -lang en

./google-maps-scraper \\
  -c 2 \\
  -depth 1 \\
  -dsn "postgres://postgres:postgres@localhost:5432/postgres"

Kubernetesデプロイメントでは、複数のレプリカを実行できます。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: google-maps-scraper
spec:
  replicas: 3
  selector:
    matchLabels:
      app: google-maps-scraper
  template:
    metadata:
      labels:
        app: google-maps-scraper
    spec:
      containers:
        - name: google-maps-scraper
          image: gosom/google-maps-scraper:latest
          args: ["-c", "1", "-depth", "10", "-dsn", "postgres://user:pass@host:5432/db"]
          resources:
            requests:
              memory: "512Mi"
              cpu: "500m"

ヘッドレスブラウザには十分なCPUとメモリの割り当てが必要です。そのため、リソースリクエストはそのままコピーせず、負荷テストを通じて調整してください。

ソースからビルド

このプロジェクトにはGo 1.26.6以降が必要です。

git clone https://github.com/gosom/google-maps-scraper.git
cd google-maps-scraper
go mod download
go build
./google-maps-scraper \\
  -input example-queries.txt \\
  -results results.csv \\
  -exit-on-inactivity 3m

開発者は、カスタムGoライタープラグインを作成することもできます。

go build -buildmode=plugin -tags=plugin -o myplugin.so myplugin.go
./google-maps-scraper \\
  -writer ~/plugins:MyWriter \\
  -input queries.txt

運用上の考慮事項

匿名テレメトリはデフォルトで有効になっており、次の設定で無効にできます。

export DISABLE_TELEMETRY=1

リポジトリはMITライセンスですが、適用されるプライバシー、データ保護、ウェブサイトの規約を遵守する責任はユーザーにあります。必要のないデータは収集せず、エクスポートした連絡先情報を保護し、本番ワークフローにはレート制限とリトライポリシーを組み込んでください。

ブラウザベースの抽出、構造化出力、再開可能なジョブ、地理的制御、プロキシ対応、API、分散実行を組み合わせたGoogle Maps Scraperは、単発のコマンド以上のものです。ローカル検索結果を、再現性と検証可能性を備えたデータパイプラインに変換したい開発者にとって、実用的な基盤となります。

ソース

gosom/google-maps-scraper: scrape data from Google Maps. Extracts data such as the name, address, phone number, website URL, rating, reviews number, latitude and longitude, reviews,email and more for each place