google-maps-scraper

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

🗺️ Google Maps Scraper

🗺️ Google Maps 数据抓取工具

Scrape data lokasi dari Google Maps tanpa API key. Pakai Playwright untuk bypass bot detection.
无需API密钥即可从Google Maps抓取地点数据。使用Playwright绕过机器人检测。

Dependencies

依赖项

bash
pip install playwright
python -m playwright install chromium
Kalau headless server/VPS, butuh extra deps:
bash
sudo apt install -y libnss3 libatk-bridge2.0-0 libdrm2 libxkbcommon0 libgbm1 libasound2
bash
pip install playwright
python -m playwright install chromium
如果是无头服务器/VPS,需要额外依赖:
bash
sudo apt install -y libnss3 libatk-bridge2.0-0 libdrm2 libxkbcommon0 libgbm1 libasound2

Cara Pakai

使用方法

CLI (direct)

CLI(直接调用)

bash
python gmaps_scraper.py "coffee shop" "Yogyakarta" --max 20
python gmaps_scraper.py "restoran" "Jakarta Selatan" --max 10 -o hasil.csv
python gmaps_scraper.py "tempat wisata" "Bali" --max 15
bash
python gmaps_scraper.py "coffee shop" "Yogyakarta" --max 20
python gmaps_scraper.py "restoran" "Jakarta Selatan" --max 10 -o hasil.csv
python gmaps_scraper.py "tempat wisata" "Bali" --max 15

Via AI Agent

通过AI Agent调用

"Cari coffee shop di Jogja dari Google Maps"
"Scrape restoran di Jakarta Selatan rating >4.5"
"Tempat wisata di Bali yang buka 24 jam"
"在日惹寻找Google Maps上的咖啡店"
"抓取雅加达南部评分>4.5的餐厅"
"巴厘岛24小时营业的旅游景点"

Arguments

参数说明

ArgDefaultDescription
query
requiredSearch query (e.g. "coffee shop")
location
requiredLocation (e.g. "Yogyakarta")
--max
50Max results
--output, -o
autoOutput CSV path
--headless
TrueRun without browser UI
--no-headless
-Show browser (debug)
--delay
1.5Scroll delay (seconds)
参数默认值描述
query
必填搜索关键词(例如:"coffee shop")
location
必填地点(例如:"Yogyakarta")
--max
50最大结果数量
--output, -o
自动生成输出CSV文件路径
--headless
True无浏览器界面运行
--no-headless
-显示浏览器界面(调试用)
--delay
1.5滚动延迟(秒)

Output Format

输出格式

CSV/JSON dengan fields:
FieldContoh
NameKopi Kultur
Rating4.8
Reviews1234
Price_rangeRp 25–50 rb
CategoryKedai Kopi
AddressJl. Kaliurang KM 5
Phone0812-xxxx-xxxx
Websitekopikultur.com
HoursBuka · Tutup pukul 22.00
CSV/JSON格式包含以下字段:
字段示例
NameKopi Kultur
Rating4.8
Reviews1234
Price_rangeRp 25–50 rb
Category咖啡店
AddressJl. Kaliurang KM 5
Phone0812-xxxx-xxxx
Websitekopikultur.com
Hours营业中 · 22:00打烊

Teknis

技术实现

  1. Buka Google Maps search URL
  2. Scroll results panel untuk load lebih banyak listing
  3. Klik setiap card → extract data dari detail panel
  4. Parse: Name, Rating, Reviews, Price, Category, Address, Phone, Website, Hours
  5. Save ke CSV + JSON
  1. 打开Google Maps搜索URL
  2. 滚动结果面板加载更多列表
  3. 点击每个卡片 → 从详情面板提取数据
  4. 解析:名称、评分、评论数、价格、类别、地址、电话、网站、营业时间
  5. 保存为CSV + JSON格式

Limitasi

限制说明

  • Tanpa login Google: max ~20 results per search
  • Rate limit: jangan scrape terlalu cepat (default delay 1.5s)
  • Data bisa berubah sewaktu-waktu (Google update struktur)
  • CSS selectors mungkin perlu update kalau Google Maps redesign
  • 未登录Google账号:每次搜索最多约20条结果
  • 速率限制:不要过快抓取(默认延迟1.5秒)
  • 数据可能随时变化(Google会更新页面结构)
  • 若Google Maps改版,CSS选择器可能需要更新

Troubleshooting

故障排除

ProblemFix
playwright not found
pip install playwright && python -m playwright install chromium
chromium failed to launch
sudo apt install libnss3 libatk-bridge2.0-0 libdrm2 libxkbcommon0 libgbm1 libasound2
timeout
Google Maps loading lambat, coba tambah timeout atau cek network
no results
Coba query yang lebih spesifik
0 data / CSS selector error
Google Maps pakai
button
bukan
a
— sudah di-fix (auto-detect)
redirect ke detail page
Auto-retry dengan coordinate URL + search box fallback
问题解决方法
playwright not found
执行
pip install playwright && python -m playwright install chromium
chromium failed to launch
执行
sudo apt install libnss3 libatk-bridge2.0-0 libdrm2 libxkbcommon0 libgbm1 libasound2
timeout
Google Maps加载缓慢,尝试增加超时时间或检查网络
no results
尝试使用更具体的搜索关键词
0 data / CSS selector error
Google Maps改用
button
而非
a
标签——已修复(自动检测)
redirect ke detail page
自动重试,使用坐标URL + 搜索框回退方案

Changelog

更新日志

2026-04-16 — Robust Selector + Redirect Fix

2026-04-16 — 增强选择器+重定向修复

  • Fix: Selector
    a[class*="hfpxzc"]
    → auto-detect
    button
    (new) /
    a
    (old) / aria-label fallback
  • Fix: Handle redirect ke detail page → auto-retry dengan coordinate URL + search box
  • New:
    get_listing_cards()
    — unified card detection
  • New:
    is_detail_page()
    — detect if redirected to single listing
  • New: Debug screenshot saved if no cards found
  • 修复:选择器从
    a[class*="hfpxzc"]
    改为自动检测
    button
    (新版)/
    a
    (旧版)/aria-label回退方案
  • 修复:处理跳转到详情页的问题→自动重试,使用坐标URL + 搜索框回退方案
  • 新增
    get_listing_cards()
    ——统一卡片检测功能
  • 新增
    is_detail_page()
    ——检测是否跳转到单个地点详情页
  • 新增:若未找到卡片则保存调试截图

2026-04-16 — URL-Based Extraction (v2)

2026-04-16 — 基于URL的提取(v2)

  • Fix: Click-based extraction only got 7 results (DOM breaks after clicking)
  • New:
    get_card_links()
    — collect all place URLs first, then visit one-by-one
  • New:
    extract_from_detail()
    — extract data when already on a place URL
  • New:
    extract_listings_click()
    — fallback click-based approach
  • Result: 7 → 45+ results per search
  • Default:
    --max
    changed from 20 to 50

Made with ❤️ by @bungkust
  • 修复:基于点击的提取仅能获取7条结果(点击后DOM结构损坏)
  • 新增
    get_card_links()
    ——先收集所有地点URL,再逐个访问
  • 新增
    extract_from_detail()
    ——在地点详情页提取数据
  • 新增
    extract_listings_click()
    ——基于点击的回退方案
  • 结果:结果数量从7条提升至45+条/次搜索
  • 默认值
    --max
    从20改为50

由@bungkust ❤️ 制作