数据爬取与线索生成
一个面向 B2B 商家线索生成的全自动数据管道。组合 Serper 搜索引擎 API、Google Maps 地点解析、Facebook 页面解析, 实现关键词生成、搜索结果采集、结构化数据提取、去重过滤与 Supabase 持久化存储的完整闭环。
每周日 02:00 (UTC) 由 APScheduler 自动触发,也可通过 POST /pipeline/run 手动执行
基于配置的基础关键词(bbq catering, bbq restaurant, smokehouse restaurant 等)与目标地区(Texas, California, UK, Australia 等),组合生成搜索关键词列表,自动去重。
对每个关键词调用 Serper Google Search API 获取自然搜索结果,同时调用 Serper Places API 获取 Google Maps 地点数据,过滤出 Facebook 和 Google Maps 链接。
访问 Google Maps 链接,使用 BeautifulSoup 解析 HTML,提取商家名称、评分、电话、网站、地址。若找到网站则进一步访问 contact 页面补充邮箱和社交媒体链接。
将 Facebook URL 标准化为 mbasic 版本以获取更好解析效果,提取 og:title 作为商家名称,从页面文本中用正则提取邮箱、电话和外站链接。
对从 Maps 获取到的网站 URL,自动访问主页和 /contact、/contact-us 页面,补充提取邮箱、电话、Facebook/Instagram 链接,丰富线索数据。
先进行内存级去重(基于 phone/website),再对 Supabase 已有数据查重,最终将唯一线索写入 leads 表。返回执行摘要(耗时、各阶段数量统计)。
封装 Serper.dev 的 Search 和 Places 两个 API 端点。Search 获取自然搜索结果并过滤出 Facebook / Google Maps 链接;Places 直接获取 Google Maps 商家数据(名称、电话、网站、地址)。
将 Facebook URL 标准化为 mbasic 版本提高解析率。通过 og:title 提取商家名称,使用正则从页面文本中提取邮箱、电话,遍历链接标签寻找外站 URL。
解析 Google Maps 页面 HTML,提取商家名称(去除 " - Google Maps" 后缀)、评分、电话号码、网站链接和地址。解析成功后自动调用 WebsiteEnricher 补充数据。
访问商家网站主页及 /contact、/contact-us 页面,用正则补充提取邮箱和电话,遍历社交链接获取 Facebook / Instagram 地址。
管道主编排逻辑:关键词生成 → Serper 搜索 → 多源解析 → 内存去重 → Supabase 查重 → 入库。每步记录统计数据,返回完整执行摘要。
Supabase 数据访问层,封装 list_leads(支持 city/source 筛选分页)、get_stats(按 source 分组统计)、exists_by_phone_or_website(去重查询)、insert_lead(写入)。
将基础关键词(如 bbq catering)与地区(Texas, UK 等)交叉组合,自动归一化去重后输出搜索关键词列表。
内存级去重:遍历线索列表,若两条线索的 phone 或 website 相同则视为重复,仅保留首条。
Pydantic 模型定义 + Supabase leads 表结构,支持 UUID 主键自动生成的完整商家线索数据。
| 方法 | 路径 | 说明 | 参数 |
|---|---|---|---|
| GET | /leads |
获取线索列表,支持筛选和分页 | city (模糊匹配), source, limit (1~1000, 默认200), offset |
| GET | /stats |
获取统计信息:总线索数 + 按来源分组计数 | - |
| POST | /pipeline/run |
手动触发一次管道执行,返回执行摘要 | - |
| 变量名 | 默认值 | 说明 |
|---|---|---|
SERPER_API_KEY必填 |
- | Serper.dev API 密钥,用于 Google Search 和 Places 搜索 |
SUPABASE_URL必填 |
- | Supabase 项目 URL |
SUPABASE_KEY必填 |
- | Supabase Service Role Key(推荐服务端写入使用) |
PIPELINE_ENABLED可选 |
true |
是否启用定时管道 |
PIPELINE_CRON可选 |
0 2 * * 0 |
Cron 表达式,默认每周日 02:00 UTC 执行 |
LOG_LEVEL可选 |
INFO |
日志级别 |
HTTP_TIMEOUT_SECONDS可选 |
30 |
HTTP 请求超时时间(秒) |
SERPER_RESULTS_LIMIT可选 |
20 |
每次 Serper 搜索返回结果数上限 |
依赖清单:fastapi, uvicorn, pydantic, pydantic-settings, httpx, beautifulsoup4, lxml, APScheduler, supabase, python-dateutil, pandas