构建一个真正可扩展的 Google Places 提取工具

发布: (2026年1月19日 GMT+8 21:23)
7 min read
原文: Dev.to

Source: Dev.to

Cover image for Building a Google Places Extraction Tool That Actually Scales

从 Google Places 提取数据看起来很简单,直到你尝试大规模操作。

几百条结果还好,几千条就开始卡顿。全国范围的提取会暴露所有问题:分页限制、重复数据、速率限制、不明确的费用、长时间运行中途失败。

本文阐述了我在构建本地 Google Places 提取工具时最终形成的 模式。示例来自英国的真实项目,但该方法 与国家无关。不进行爬取。不使用 SaaS。仅是受控、可重复的提取。

真正的问题不是访问

Google Places 数据可以通过官方 API 访问。这并不是难点。

难点在于它周围的所有事情:

  • 分页上限导致必须分散查询
  • 同一家企业会出现在多个附近搜索中
  • API 速率限制和临时错误
  • 长时间的提取在数小时的进度后失败
  • 在任务完成之前无法看到费用

大多数工具要么忽视这些限制,要么将其隐藏在订阅后面。

强制结构的使用案例

原始任务在纸面上很简单:

  • 提取英国各地的理发师
  • 包含电话号码
  • 导出为 CSV
  • 避免重复
  • 保持 API 成本可预测

实际上,这意味着需要覆盖英格兰、苏格兰、威尔士和北爱尔兰的 200+ 城市,同时保持任务可恢复且可审计。这迫使我们采用更为严谨的架构。

核心设计原则

与国家无关的搜索策略

英国案例使用了预定义的城市列表。相同的方法可以在任何地方使用。关键不在于国家,而在于 搜索网格

  • 城市、地区或自定义位置
  • 每个位置一次查询
  • 对每个区域的分页深度进行控制

更改输入列表后,工具即可在全球范围内工作。

明确的分页控制

Google Places 的分页速度慢且有上限。该工具:

  • 限制每个位置的页面数量
  • 在页面请求之间插入延迟
  • 当结果变得冗余时提前停止

这在原始速度与可预测性之间做出权衡。规模化时,可预测性更重要。

去重作为首要任务

重复数据是必然的。去重基于:

  • Place ID(地点 ID)
  • 电话号码

这可以消除相邻城市以及重复查询之间的重叠。去重不是事后清理步骤,而是提取循环的一部分。

导出前过滤,而非事后过滤

在 Excel 中筛选成千上万行是失败的做法。工具在提取过程中进行过滤:

  • 包含关键词
  • 排除关键词
  • 可选的电话要求

不良数据永远不会写入磁盘。

限流与检查点

长时间运行时有两件事很重要:

  • 不被封锁
  • 不丢失进度

该工具包括:

  • 请求之间的固定延迟
  • 定期将检查点保存到磁盘

如果进程中止,它会从最近的检查点恢复。无需重新运行,也不会浪费配额。

示例配置模式

一个简化的配置在概念上看起来是这样的:

  • 搜索查询和可选的地点类型
  • 目标结果数量
  • 包含和排除的关键字
  • 分页深度
  • 请求延迟
  • 输出格式和检查点间隔

逻辑保持稳定。可变性转移到配置中。

为什么这不是爬取

此方法使用官方的 Google Places API。这带来了权衡:

  • 您遵守速率限制
  • 您按请求付费
  • 您接受 API 的数据模型

作为回报,您获得:

  • 稳定性
  • 法律明确性
  • 可预测的失败

对于许多业务数据集,这比爬取更合适的权衡。

此模式未解决的内容

明确表达很重要。此会:

  • 绕过 Google 限制
  • 提取隐藏字段
  • 保证超出 API 约束的完整性

它优化的是控制,而非全知。

从脚本到产品,理念不变

首个版本是为客户项目构建的 Node.js 脚本。随后,同样的模式演变为本地桌面应用:

  • 使用 UI 取代配置文件
  • 实时成本估算
  • 暂停与恢复控制
  • 字段级别的导出选择

相同的原则。更好的可用性。重要的不是应用本身,而是模式。

要点

如果你需要大规模获取 Google Places 数据,制胜之道不是巧妙的爬取,而是:

  • 将地理区域划分为受控单元
  • 将分页和去重视为核心逻辑
  • 及早显现成本和失败
  • 在本地运行,使用自己的 API 密钥

其他一切都是实现细节。

Back to Blog

相关文章

阅读更多 »