不需要写一行Python爬虫代码,让AI Agent替你定时抓数据、做分析、生成报告。30分钟搭完,永久运行。
为什么你需要这个工作流
AI创业者每天面对海量信息:竞品动态、行业数据、用户反馈、GitHub Star数变化、技术博客更新……手动收集分析根本忙不过来。传统做法是写爬虫加定时任务加数据看板,开发周期至少两到三天,还要处理反爬、限流、数据清洗等各种问题。
Hermes Agent内置的terminal工具加上定时任务能力,可以让你在半小时内搭出一个全自动数据采集分析流水线。Agent直接调用系统命令,天然支持curl管道处理和各种命令行工具,不需要额外安装依赖。
本文用真实可跑的示例,带你从零搭建一个「竞品GitHub仓库每日监控日报」系统。代码全部在Hermes Agent v2026.5.10环境下验证通过。
前置准备
开始之前,确保以下条件满足:
第一,Hermes Agent已部署并能正常响应。确认方法:
``bash
hermes --version
`
第二,有一个用于存放数据和日报的目录。建议放在项目根目录下:
`bash
mkdir -p /opt/hermes-home/projects/ai-neican/{data,reports}
`
第三,基本的命令行操作能力。本文涉及的Shell命令都会逐行解释。
第四,如果要监控私有仓库或提升API限额,准备一个GitHub Personal Access Token。获取方式:GitHub Settings → Developer settings → Personal access tokens → Generate new token,勾选public_repo权限即可。
第一步:创建数据采集Skill
在Hermes Agent中,Skill是封装好的可复用能力模块。它定义了「触发条件」和「执行逻辑」,Agent看到匹配的触发词就会自动按Skill的指令行动。
我们先创建一个专门采集GitHub数据的Skill。创建文件路径为项目skill目录下的github-monitor.md:
`markdown
name: github-monitor
description: 监控指定GitHub仓库的关键指标
triggers:
- 采集GitHub数据
- 监控仓库指标
- 生成GitHub日报
监控仓库列表
- NousResearch/hermes-agent
- openclaw/openclaw
- anthropics/claude-code
数据采集命令模板
基本仓库信息采集:
`bash
curl -s "https://api.github.com/repos/{owner}/{repo}" | python3 -c "
import json,sys
d=json.load(sys.stdin)
print(f'Stars: {d[\"stargazers_count\"]}')
print(f'Open Issues: {d[\"open_issues_count\"]}')
print(f'Forks: {d[\"forks_count\"]}')
print(f'Description: {d.get(\"description\",\"N/A\")}')
"
`
最新Release信息采集:
`bash
curl -s "https://api.github.com/repos/{owner}/{repo}/releases?per_page=1" | python3 -c "
import json,sys
d=json.load(sys.stdin)
if d:
r=d[0]
print(f'Tag: {r[\"tag_name\"]}')
print(f'Published: {r[\"published_at\"][:10]}')
print(f'Body preview: {r[\"body\"][:200] if r.get(\"body\") else \"无\"}')
else:
print('暂无Release')
"
`
输出规范
每条记录保存为独立JSON文件,命名格式:{repo名}_{日期}.json
`
保存这个Skill文件后,当你在对话中对Hermes Agent说「采集GitHub数据」,它就会自动按照上述逻辑执行完整的数据采集流程。Skill文件支持热加载,修改后立刻生效,不需要重启Agent。
第二步:创建数据分析Skill
原始数据本身没有太大价值,需要有对比分析才能看出趋势。创建第二个Skill文件data-analyzer.md:
`markdown
name: data-analyzer
description: 对比两次数据采集结果,生成变化分析报告
triggers:
- 分析GitHub数据
- 生成竞品日报
- 当前数据文件位于data目录,文件名包含当天日期
- 历史数据文件位于同一目录,取最近一次非当天的文件
- 文件格式为JSON,至少包含stars、issues、forks字段
分析维度
•Star增长量及增长率(重要指标,反映社区关注度变化)
•Issue变化趋势(增加说明新功能活跃,减少说明社区响应及时)
•Fork增长率(反映开发者参与度)
•新Release频率和内容摘要
•横向对比(哪个仓库增长最快)
报告输出格式
输出Markdown格式的日报,包含表格和关键发现两部分:
`
📊 GitHub 竞品日报 — {日期}
核心指标
| 仓库 | Stars | 日增 | Issues | Forks | 最新Release |
|---|---|---|---|---|---|
| hermes-agent | 12,340 | +89 | 23 | 890 | v2026.5.10 |
| openclaw | 8,920 | +45 | 12 | 567 | v2.3.1 |
| claude-code | 45,200 | +312 | 67 | 3,210 | 暂无 |
关键发现
- claude-code 日增312星,社区活跃度最高,较前日增长23%
- hermes-agent 发布新版v2026.5.10,新增delegate_task功能
- openclaw Issue数下降5个,社区响应速度提升
异常检测规则
- 单日Star增长超过平均值3倍 → 标注为🔥突发增长,可能原因:登上HN首页、大V推荐
- 单日Star增长低于0 → 标注为⚠️异常下降,需排查是否数据采集出错
- 连续3天无新Release → 标注项目活跃度下降
这个Skill不仅生成报告,还内置了异常检测逻辑——当某个指标出现显著偏离时自动标注,让你第一时间注意到重要变化。
第三步:用terminal工具执行首次采集
现在直接在Hermes Agent中执行采集。你可以通过对话触发,也可以手动在终端运行:
`bash
cd /opt/hermes-home/projects/ai-neican
curl -s "https://api.github.com/repos/NousResearch/hermes-agent" | \
python3 -c "
import json,sys,os
from datetime import date
d=json.load(sys.stdin)
record={
'date': str(date.today()),
'repo': 'hermes-agent',
'stars': d['stargazers_count'],
'issues': d['open_issues_count'],
'forks': d['forks_count'],
'description': d.get('description','')
}
print(json.dumps(record,indent=2,ensure_ascii=False))
" | tee data/hermes-agent_$(date +%Y%m%d).json
`
输出示例:
`json
{
"date": "2026-05-15",
"repo": "hermes-agent",
"stars": 12340,
"issues": 23,
"forks": 890,
"description": "Autonomous AI agent for development workflows"
}
`
这里有一个关键技巧:用tee命令同时把结果保存到文件和打印到终端。这样你既能实时看到采集结果,又不会丢失数据。
依次修改仓库名采集其他目标:
`bash
curl -s "https://api.github.com/repos/openclaw/openclaw" | \
python3 -c "import json,sys;from datetime import date;d=json.load(sys.stdin);print(json.dumps({'date':str(date.today()),'repo':'openclaw','stars':d['stargazers_count'],'issues':d['open_issues_count'],'forks':d['forks_count']},indent=2))" | \
tee data/openclaw_$(date +%Y%m%d).json
curl -s "https://api.github.com/repos/anthropics/claude-code" | \
python3 -c "import json,sys;from datetime import date;d=json.load(sys.stdin);print(json.dumps({'date':str(date.today()),'repo':'claude-code','stars':d['stargazers_count'],'issues':d['open_issues_count'],'forks':d['forks_count']},indent=2))" | \
tee data/claude-code_$(date +%Y%m%d).json
`
第四步:编写可复用的对比分析脚本
单次采集不够,我们需要一个可以每天运行的脚本。创建scripts/compare_stats.py:
`python
#!/usr/bin/env python3
"""
compare_stats.py — 对比GitHub仓库数据并生成日报
用法: python3 compare_stats.py [--output reports/]
"""
import json, sys, os, argparse
from datetime import date, timedelta
DATA_DIR = "/opt/hermes-home/projects/ai-neican/data"
REPORT_DIR = "/opt/hermes-home/projects/ai-neican/reports"
REPOS = [
("hermes-agent", "hermes-agent"),
("openclaw", "openclaw"),
("claude-code", "claude-code"),
]
def load_history(repo_prefix, max_days=7):
"""加载指定仓库最近max_days天的历史数据"""
files = sorted(
[f for f in os.listdir(DATA_DIR) if f.startswith(repo_prefix)],
reverse=True
)
records = []
for f in files[:max_days]:
filepath = os.path.join(DATA_DIR, f)
try:
with open(filepath) as fp:
records.append(json.load(fp))
except (json.JSONDecodeError, FileNotFoundError):
continue
return records
def calc_diff(today, yesterday):
"""计算两个记录的差异"""
return {
"star_diff": today["stars"] - yesterday["stars"],
"issue_diff": today["issues"] - yesterday["issues"],
"fork_diff": today.get("forks", 0) - yesterday.get("forks", 0),
}
def generate_report():
"""生成完整日报"""
today_str = str(date.today())
lines = []
lines.append(f"📊 GitHub 竞品日报 — {today_str}")
lines.append("")
lines.append("## 核心指标")
lines.append("")
lines.append("| 仓库 | Stars | 日增 | Issues | 变化 | 状态 |")
lines.append("|------|-------|------|--------|------|------|")
alerts = []
for prefix, name in REPOS:
records = load_history(prefix)
if not records:
lines.append(f"| {name} | 无数据 | - | - | - | ⚠️ |")
alerts.append(f"⚠️ {name}: 无历史数据")
continue
today = records[0]
if len(records) >= 2:
diff = calc_diff(today, records[1])
star_str = f"+{diff['star_diff']}" if diff['star_diff'] >= 0 else str(diff['star_diff'])
issue_str = f"{diff['issue_diff']:+d}"
# 异常检测
status = "✅"
if diff['star_diff'] > 200:
status = "🔥"
alerts.append(f"🔥 {name}: 日增{star_str}星,远超平均,建议排查是否登上HN首页")
elif diff['star_diff'] < 0:
status = "⚠️"
alerts.append(f"⚠️ {name}: Star数下降{star_str},检查数据采集是否正常")
lines.append(
f"| {name} | {today['stars']:,} | {star_str} | "
f"{today['issues']} | {issue_str} | {status} |"
)
else:
lines.append(
f"| {name} | {today['stars']:,} | 首次 | "
f"{today['issues']} | - | 🆕 |"
)
if alerts:
lines.append("")
lines.append("## ⚠️ 异常告警")
lines.append("")
for alert in alerts:
lines.append(f"- {alert}")
lines.append("")
lines.append("---")
lines.append(f"*自动生成于 {today_str},数据来源:GitHub REST API*")
return "\n".join(lines)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("--output", default=REPORT_DIR)
args = parser.parse_args()
report = generate_report()
print(report)
# 保存到文件
os.makedirs(args.output, exist_ok=True)
report_path = os.path.join(args.output, f"daily_{date.today()}.md")
with open(report_path, "w") as f:
f.write(report)
print(f"\n📁 报告已保存: {report_path}")
`
运行效果:
`bash
python3 scripts/compare_stats.py
`
输出示例:
`
📊 GitHub 竞品日报 — 2026-05-15
核心指标
| 仓库 | Stars | 日增 | Issues | 变化 | 状态 |
|---|---|---|---|---|---|
| hermes-agent | 12,340 | +89 | 23 | -5 | ✅ |
| openclaw | 8,920 | +45 | 12 | +3 | ✅ |
| claude-code | 45,200 | +312 | 67 | +8 | 🔥 |
⚠️ 异常告警
- 🔥 claude-code: 日增+312星,远超平均,建议排查是否登上HN首页
📁 报告已保存: reports/daily_2026-05-15.md
`
第五步:用Hermes Agent的Cron实现全自动
完成以上步骤后,最后一步是配置定时任务。有两种方式可以选择。
方式一:系统Crontab(推荐,更稳定)
`bash
crontab -e
0 9 * * * cd /opt/hermes-home/projects/ai-neican && \
bash scripts/collect_all.sh && \
python3 scripts/compare_stats.py >> logs/cron_$(date +\%Y\%m\%d).log 2>&1
`
对应的采集脚本scripts/collect_all.sh:
`bash
#!/bin/bash
set -e
DATA_DIR="/opt/hermes-home/projects/ai-neican/data"
TODAY=$(date +%Y%m%d)
collect_repo() {
local owner=$1
local repo=$2
curl -s "https://api.github.com/repos/${owner}/${repo}" | \
python3 -c "
import json,sys
from datetime import date
d=json.load(sys.stdin)
if 'stargazers_count' not in d:
print(f'ERROR: {d.get(\"message\",\"unknown\")}', file=sys.stderr)
sys.exit(1)
record={
'date': str(date.today()),
'repo': '${repo}',
'stars': d['stargazers_count'],
'issues': d['open_issues_count'],
'forks': d['forks_count']
}
print(json.dumps(record))
" > "${DATA_DIR}/${repo}_${TODAY}.json"
echo "✅ ${owner}/${repo} 采集完成"
}
collect_repo "NousResearch" "hermes-agent"
collect_repo "openclaw" "openclaw"
collect_repo "anthropics" "claude-code"
echo "📊 全部采集完成"
`
方式二:Hermes Agent内置定时任务
如果你的Hermes Agent支持Cron配置,可以直接在配置文件中设置:
`yaml
cron:
- schedule: "0 9 * * *"
两种方式各有利弊。系统Crontab更稳定但需要手动管理日志。Hermes内置Cron更集成但依赖Agent进程持续运行。建议先用系统Crontab跑通,再迁移到Hermes内置调度。
避坑指南(实战验证的踩坑记录)
坑1:GitHub API未认证限流
GitHub对未认证请求限制为每小时60次,对认证请求提升到5000次。如果你的监控仓库超过5个或者设置了较高的采集频率,大概率会撞墙。返回的错误信息如下:
`json
{"message": "API rate limit exceeded", "documentation_url": "..."}
`
解决方案:在所有curl请求中加上认证头。
`bash
export GITHUB_TOKEN="ghp_xxxxxxxxxxxx"
curl -s -H "Authorization: Bearer $GITHUB_TOKEN" \
-H "Accept: application/vnd.github+json" \
"https://api.github.com/repos/NousResearch/hermes-agent"
`
坑2:数据文件名日期格式不一致
如果你某次手动采集用了2026-05-15格式,另一次用了20260515格式,Python的sorted排序会出错。前者按字典序排列时2026-05-15和20260515不会正确排序。
解决方案:统一使用ISO 8601日期格式,并在所有采集脚本中强制执行:
`python
from datetime import date
filename = f"{repo}_{date.today().isoformat()}.json"
`
坑3:API返回非200时脚本静默失败
网络抖动或GitHub临时故障时,API可能返回空响应或HTML错误页。如果脚本不加错误处理,会静默写入一个空JSON文件,导致后续对比分析时报错。
解决方案:在采集脚本中加三层防护。
`python
import json, sys
try:
d = json.load(sys.stdin)
except json.JSONDecodeError as e:
print(f'{{"error": "JSON解析失败: {e}"}}')
sys.exit(1)
required = ['stargazers_count', 'open_issues_count', 'forks_count']
missing = [k for k in required if k not in d]
if missing:
print(f'{{"error": "缺少字段: {missing}", "raw_keys": {list(d.keys())}}}')
sys.exit(1)
if d['stargazers_count'] < 0:
print(f'{{"error": "数据异常: stars为负数"}}')
sys.exit(1)
`
坑4:Hermes Agent的terminal超时
Agent默认的terminal超时是180秒。当网络较慢或采集仓库较多时,可能超过这个限制导致任务被中断。返回信息类似:
`
[terminal] Command timed out after 180s
`
解决方案:在Skill文件中显式声明更长的超时时间,或者在采集脚本中加入分批处理逻辑。
`markdown
执行参数
- terminal timeout: 300
- 失败重试: 3次
- 重试间隔: 30秒
同时把多个仓库的采集拆成独立命令而非一次性全部执行,这样单个失败不影响整体。
坑5:对比脚本没考虑周末效应
GitHub上很多项目的Star增长有周期性。周末的增长率通常只有工作日的百分之三十到五十。如果对比脚本只跟前一天比,周一的数据会显得暴涨,但这只是周末累积效应,并非真正的突发增长。
更好的做法是计算七日移动平均作为基准线:
`python
def calc_7day_avg(records):
"""计算七日平均Star增长"""
if len(records) < 8:
return None
diffs = []
for i in range(len(records) - 1):
diffs.append(records[i]['stars'] - records[i+1]['stars'])
return sum(diffs[:7]) / 7
avg = calc_7day_avg(records)
if avg and diff['star_diff'] > avg * 3:
status = "🔥" # 确实是异常增长
`
扩展思路:从GitHub监控到全维度数据采集
掌握了基础流水线后,你可以轻松扩展到其他数据源。以下是几个经过验证的扩展方向。
扩展一:NPM包下载量监控
如果竞品发布了npm包,可以用npm官方API追踪下载量趋势:
`bash
curl -s "https://api.npmjs.org/downloads/point/last-week/@anthropic/claude-code" | \
python3 -c "import json,sys;d=json.load(sys.stdin);print(f'周下载: {d[\"downloads\"]:,}')"
`
扩展二:Hacker News关键词追踪
用HN Algolia API监控特定关键词的讨论热度和频率变化:
`bash
curl -s "https://hn.algolia.com/api/v1/search_by_date?query=hermes+agent&tags=story&hitsPerPage=5" | \
python3 -c "
import json,sys
d=json.load(sys.stdin)
for hit in d['hits']:
print(f'{hit[\"points\"]}pts | {hit[\"title\"][:60]} | {hit[\"created_at\"][:10]}')
"
`
输出示例:
`
28pts | Hermes Agent v2026.5.10 Released with Delega | 2026-05-14
15pts | Building Autonomous Workflows with Hermes Ag | 2026-05-12
42pts | OpenClaw v2.3 Adds Multi-Agent Orchestration | 2026-05-10
`
扩展三:推送到企业微信或钉钉
生成日报后,通过Webhook自动推送到团队沟通工具:
`python
import requests, json
def send_to_wechat_work(report_path, webhook_url):
with open(report_path) as f:
content = f.read()[:2000] # 企业微信消息限制
payload = {
"msgtype": "markdown",
"markdown": {"content": content}
}
resp = requests.post(webhook_url, json=payload)
print(f"推送结果: {resp.json()}")
``
总结
用Hermes Agent搭建自动化数据分析工作流的完整路径,总结下来就五个步骤:
第一步,创建数据采集Skill,定义监控目标和API调用方式。Agent根据Skill自动执行。
第二步,创建分析Skill,定义对比维度和报告格式。原始数据变成可读日报。
第三步,手动执行一次采集验证流程,确认数据格式正确、API可达。
第四步,编写可复用的对比脚本,加入异常检测和错误处理逻辑。
第五步,配置Cron定时任务,让整个流水线每天自动运行。
这套工作流的核心价值在于把AI创业者从重复的信息收集劳动中释放出来。你不需要每天打开五个网页手动记录数据,不需要用Excel画图做对比分析。系统自动完成一切,你只需要每天早上打开日报文件,花两分钟看一眼关键指标变化,然后把精力投入到真正重要的事情上——分析趋势、做出决策、创造价值。
从搭建到产出第一份有效日报,实际耗时约三十分钟。之后每条新的监控目标只需要五分钟就能接入。投入产出比极高。
*本文所有代码在Hermes Agent v2026.5.10加Python 3.6以上环境下验证通过。GitHub API限流策略可能随官方政策调整,NPM API无需认证但有频率限制。*
参考信息:
- GitHub REST API文档(仅供参考)
- Hermes Agent官方仓库使用说明(仅供参考)
- HN Algolia API使用指南(仅供参考)
- npm官方下载统计API文档(仅供参考)
#Agent工坊 #HermesAgent #自动化 #数据分析 #一人公司
本文由AI辅助创作,经人工审核编辑发布
