uppifyagency/ghostmap

GitHub: uppifyagency/ghostmap

开源的Google Maps数据抓取Chrome插件,提取商业信息至CSV。

Stars: 8 | Forks: 6

# 👻🗺️ Ghost Map Pro ## 🧭 什么是 Ghost Map Pro? ## ✨ 功能说明 您在 Google Maps 上搜索;Ghost Map Pro 会静默捕获结果中的每个商家并构建一个线索表格: | 输出 | 包含内容 | |---|---| | 📊 **`ghost-map-.csv`** | 一份宽泛的、适配 CRM 的线索表 — 包含多达 **49 个结构化列**:名称、电话、网站、**邮箱**、完整地址、评分(小数)、评论数、价格区间、营业时间、类别、纬度/经度、邮政编码、省份、国家、Knowledge-Graph ID、所有者信息、主图、预订链接以及线索质量信号(认领状态、所有者最后更新时间、评论分布)。 | | 📧 **邮箱发现** | 对于每个有网站的商家,扩展程序会访问其主页以及常见的 `/contact`、`/about`、`/privacy` 页面,并提取真实的商家邮箱 — 同时过滤掉跟踪像素、Cloudflare 混淆的地址以及占位收件箱。 | | 🇮🇹 **意大利市场专属字段** | 一流的 **Partita IVA (VAT)** 提取功能,带有官方校验和验证、`it_IT` 区域设置、逗号小数处理和复合标签页脚解析 — 这是大多数通用 Google Maps 抓取工具会遗漏的细节。 | ## 🚀 特性 ## 📊 输出示例 以下是真实运行 `ristoranti Milano`(米兰餐厅)后获取的部分列(数值已匿名化处理): ``` name,phone,website,email,rating,reviews,address,partita_iva,category "Trattoria Esempio","+39 02 1234567","trattoria-esempio.it","info@trattoria-esempio.it",4.6,318,"Via Esempio 8, 20121 Milano MI","01234567890","Restaurant" "Bar Esempio","+39 02 7654321","bar-esempio.it","ciao@bar-esempio.it",4.4,127,"Corso Esempio 2, 20144 Milano MI","09876543210","Cafe" ``` 在 Excel/Sheets 中打开它,或者直接导入到您的 CRM 中并开始外联。 ## 📦 安装 ## 🖱️ 用法 1. 打开 **google.com/maps** 并运行任意搜索(例如 `hotels Florence`、`idraulici Roma`)。 2. 点击 👻 图标打开 **Ghost Map Pro 侧边栏**。 3. 以适合的模式捕获结果: - **滚动** — 滚动 Maps 结果列表;随着新商家的不断载入,扩展程序会静默进行捕获。 - **Turbo** — 一键抓取当前已载入的所有结果。 - **区域搜索** — 输入一个城市/区域,让它为您扫描网格。 4. *(可选)* 启用 **邮箱发现** 以获取每个商家的网站并提取其邮箱。 5. 点击 **导出** → 下载 **CSV**(或将其发送到您的 webhook)。完成。 ## 🧱 工作原理 ``` ┌──────────────────────────────────────────────────────────────────┐ │ 🪟 SIDE PANEL (ui/sidepanel.html) │ │ drives the flow · renders progress · exports CSV / webhook │ └──────────────┬─────────────────────────────────────▲──────────────┘ start / stop │ │ results · stats area search ▼ │ ┌──────────────────────────────────────────────────────────────────┐ │ 💾 SERVICE WORKER (background/sw.js · MV3 module) │ │ ├─ job queue + autoscaler ├─ area-search grid sweep │ │ ├─ 📧 email-scraper-v2 └─ 🪝 ExportAPI (CSV + webhook) │ │ └─ uses ▶ FingerprintGenerator · SessionPool · CircuitBreaker │ └───────▲──────────────────────────────────┬────────────────────────┘ │ business records │ parse website HTML ┌───────┴───────────────────────────┐ ┌───▼────────────────────────┐ │ CONTENT SCRIPTS (on Google Maps) │ │ OFFSCREEN (offscreen/) │ │ content/gmb/maps-state-watcher │ │ DOM-parses fetched pages │ │ (MAIN world) reads APP_INIT_STATE│ │ for the EmailExtractor │ │ + captures JSPB during scroll │ └─────────────────────────────┘ │ content/gmb/detail-fetcher │ └────────────────────────────────────┘ ``` **Runtime 布局:** ``` manifest.json # MV3 background/ sw.js # service-worker entry email-scraper-v2.js # website fetch + email discovery area-search.js # area/grid lead sweep jobQueue.js · autoscaler ... # scheduling + backpressure content/gmb/ maps-state-watcher.js # MAIN-world: reads page state + JSPB detail-fetcher.js · loader.js # per-place enrichment offscreen/parser.js # off-DOM HTML parsing for emails lib/ EmailExtractor.js # business-email extraction + filters partitaIva.js # Italian VAT, checksum-validated phone-normalizer.js # EU phone normalization (Excel-safe) FingerprintGenerator.js # coherent browser fingerprints SessionPool.js · CircuitBreaker.js# anti-detection + backoff ExportAPI.js # CSV + SSRF-hardened webhook export ui/sidepanel.html / .js # the panel + state controller ``` ## 🛡️ 反检测 抓取 Google Maps 时的主要风险在于请求频率,因此 Ghost Map Pro 被设计得像一个真实的用户: - **一致的指纹** — `FingerprintGenerator` 保持 User-Agent、Accept-Language q-values 和 client hints 内部一致(没有暴露身份的不匹配项)。 - **Session 池** — 在 service-worker 重启期间轮换并保持 session。 - **熔断机制** — 遇到 `429` / `503` 或 Cloudflare 验证时,它会开启冷却期并退避,而不是继续强行请求。 - **邮箱发现限流** — 在获取商家网站时具有按 worker 计算的失败计数器和步调控制。 即便如此:请以人类操作的频率适度使用。请参阅[负责任地使用](#-privacy--responsible-use)。 ## ⚖️ Ghost Map Pro vs Apify vs Outscraper vs 官方 API | | 👻 **Ghost Map Pro** | 💰 Apify / Outscraper | 🏢 Google Places API | |---|---|---|---| | **成本** | 免费且开源 | 按次/按行付费 | 有免费额度,之后按每 1000 次计费 | | **设置** | 加载未打包的扩展程序 | 账号 + actor / token | 云项目 + 计费 + 密钥 | | **API key** | ❌ 不需要 | ✅ 平台 token | ✅ 需要计费 API key | | **邮箱发现** | ✅ 内置 | 💲 通常为付费附加项 | ❌ 不提供 | | **运行环境** | 您的本地浏览器 | 服务商的云端 | Google 服务器 | | **数据存储位置** | 保留在您的机器上 | 服务商的云存储 | Google | | **意大利增值税 (P.IVA)** | ✅ 校验和验证 | ⚠️ 极少支持 | ❌ 无 | | **开源** | ✅ MIT | ❌ | ❌ | 如果您搜索过 *"google maps scraper github"*、*"apify alternative"* 或 *"free google maps lead extractor"* — 这就是满足需求的本地化、免密钥版本。 ## 🔐 隐私与负责任地使用 ## ❓ 常见问题 **抓取 Google Maps 合法吗?** 为了 B2B 调研而抓取公开可见的商家信息已被广泛采用,但其合法性取决于您所在的司法管辖区、您如何使用这些数据以及平台的服务条款。Ghost Map Pro 仅读取公开数据并将其保存在本地 — 但合规性(Google 服务条款、GDPR、外联法规)由您自行承担。如有疑问,请咨询律师。 **我需要 Google Maps / Places API key 吗?** 不需要。这正是它的核心所在 — 它直接读取您浏览器中已经加载的数据。 **它在意大利以外的地区有效吗?** 是的。核心字段(名称、电话、网站、邮箱、评分、评论、地址、营业时间、地理位置)是国际通用的。**Partita IVA** 字段是意大利特有的附加功能。 **邮箱是从哪里来的?** 来自每个商家*自己的网站*,而不是来自 Google。如果某个商家没有网站(或者网站上没有邮箱),那么该行就只是没有邮箱数据。 **这会导致我的账号或 IP 被封锁吗?** 请适度抓取。反检测层降低了风险,但高频率、大批量的运行仍可能触发速率限制。保持在人类操作的频率是安全区。 **它在 Chrome 网上应用店上吗?** 没有 — 它是通过从源代码加载未打包的扩展程序来运行的,这保证了它的免费性和可审计性。 ## 📄 许可证 [MIT](LICENSE) — 可免费使用、fork 和修改。
**Ghost Map Pro** · 一款免费的 **Google Maps 抓取和线索提取** Chrome 扩展程序 由 [Vlad Vrinceanu](https://www.linkedin.com/in/vladvrinceanu/) 开发 · 由 [Uppify](https://github.com/uppifyagency) 维护 *关键词:google maps scraper · scrape google maps · google maps lead generation · google maps email extractor · google maps data extractor · google business profile scraper · apify / outscraper / octoparse alternative · chrome extension · manifest v3 · no API.*
标签:自定义脚本