
关于
构建全自动 AI 驱动的数据采集代理,适用于任何公开数据源 — 招聘网站、价格、新闻、GitHub、体育等。按计划抓取,使用免费 LLM(Gemini Flash)丰富数据,存储到 Notion/Sheets/Supabase,并从用户反馈中学习。在 GitHub Actions 上 100% 免费运行。
name: data-scraper-agent description: 构建全自动 AI 驱动的数据采集 Agent,适用于任何公开数据源——招聘网站、价格、新闻、GitHub、体育等。按计划抓取,使用免费 LLM(Gemini Flash)丰富数据,将结果存储到 Notion/Sheets/Supabase,并从用户反馈中学习。100% 免费运行在 GitHub Actions 上。当用户想要自动监控、收集或跟踪任何公开数据时使用。 origin: community
数据抓取 Agent
构建生产就绪的 AI 驱动数据采集 Agent,适用于任何公开数据源。 按计划运行,使用免费 LLM 丰富结果,存储到数据库,并随时间改进。
技术栈:Python · Gemini Flash(免费)· GitHub Actions(免费)· Notion / Sheets / Supabase
何时激活
- 用户想要抓取或监控任何公开网站或 API
- 用户说"构建一个检查...的机器人"、"帮我监控 X"、"从...收集数据"
- 用户想要跟踪职位、价格、新闻、仓库、体育比分、活动、列表
- 用户询问如何在不付费托管的情况下自动化数据收集
- 用户想要一个基于其决策随时间变得更智能的 Agent
核心概念
三层架构
每个数据抓取 Agent 都有三层:
COLLECT → ENRICH → STORE
│ │ │
Scraper AI (LLM) Database
runs on scores/ Notion /
schedule summarises Sheets /
& classifies Supabase
免费技术栈
| 层级 | 工具 | 原因 |
|---|---|---|
| 抓取 | requests + BeautifulSoup | 零成本,覆盖 80% 的公开网站 |
| JS 渲染网站 | playwright(免费) | 当 HTML 抓取失败时使用 |
| AI 丰富 | Gemini Flash REST API | 500 请求/天,100万 token/天——免费 |
| 存储 | Notion API | 免费层,优秀的审查 UI |
| 调度 | GitHub Actions cron | 公开仓库免费 |
| 学习 | 仓库中的 JSON 反馈文件 | 零基础设施,持久化在 git 中 |
AI 模型降级链
构建 Agent 在配额耗尽时自动降级到不同 Gemini 模型:
gemini-2.0-flash-lite (30 RPM) →
gemini-2.0-flash (15 RPM) →
gemini-2.5-flash (10 RPM) →
gemini-flash-lite-latest (fallback)
批量 API 调用提高效率
永远不要每个项目调用一次 LLM。始终批量处理:
# BAD: 33 API calls for 33 items
for item in items:
result = call_ai(item) # 33 calls → hits rate limit
# GOOD: 7 API calls for 33 items (batch size 5)
for batch in chunks(items, size=5):
results = call_ai(batch) # 7 calls → stays within free tier
工作流
步骤 1:理解目标
询问用户:
- 收集什么: "什么数据源?URL / API / RSS / 公开端点?"
- 提取什么: "哪些字段重要?标题、价格、URL、日期、评分?"
- 如何存储: "结果应该存到哪里?Notion、Google Sheets、Supabase 还是本地文件?"
- 如何丰富: "你想让 AI 对每个项目评分、摘要、分类还是匹配?"
- 频率: "多久运行一次?每小时、每天、每周?"
常见示例提示:
- 招聘网站 -> 根据简历评估相关性
- 产品价格 -> 降价时提醒
- GitHub 仓库 -> 摘要新版本发布
- 新闻源 -> 按主题 + 情感分类
- 体育结果 -> 提取统计数据到追踪器
- 活动日历 -> 按兴趣过滤
步骤 2:设计 Agent 架构
为用户生成此目录结构:
my-agent/
├── config.yaml # 用户自定义(关键词、过滤器、偏好)
├── profile/
│ └── context.md # AI 使用的用户上下文(简历、兴趣、标准)
├── scraper/
│ ├── __init__.py
│ ├── main.py # 编排器:抓取 → 丰富 → 存储
│ ├── filters.py # 基于规则的预过滤(快速,在 AI 之前)
│ └── sources/
│ ├── __init__.py
│ └── source_name.py # 每个数据源一个文件
├── ai/
│ ├── __init__.py
│ ├── client.py # Gemini REST 客户端,带模型降级
│ ├── pipeline.py # 批量 AI 分析
│ ├── jd_fetcher.py # 从 URL 获取完整内容(可选)
│ └── memory.py # 从用户反馈中学习
├── storage/
│ ├── __init__.py
│ └── notion_sync.py # 或 sheets_sync.py / supabase_sync.py
├── data/
│ └── feedback.json # 用户决策历史(自动更新)
├── .env.example
├── setup.py # 一次性数据库/schema 创建
├── enrich_existing.py # 回填旧行的 AI 评分
├── requirements.txt
└── .github/
└── workflows/
└── scraper.yml # GitHub Actions 调度
步骤 3:构建抓取源
任何数据源的模板:
# scraper/sources/my_source.py
"""
[Source Name] — scrapes [what] from [where].
Method: [REST API / HTML scraping / RSS feed]
"""
import requests
from bs4 import BeautifulSoup
from datetime import datetime, timezone
from scraper.filters import is_relevant
HEADERS = {
"User-Agent": "Mozilla/5.0 (compatible; research-bot/1.0)",
}
def fetch() -> list[dict]:
"""
Fetch and return structured items from the source.
Each item should have at minimum: title, url, date_found
"""
pass
兼容工具
Claude CodeCursor
标签
AI与机器学习
