🕷️ 数据采集 Agent
MCP/RSS/浏览器搜索三合一全网采集
用 OpenClaw 构建自动化数据采集 Agent,整合三种采集方式,实现全网信息监控。
---
<## id="section-0">📊 采集架构</##>
┌─────────────────┐
│ 数据采集 Agent │
└────────┬────────┘
│
┌────────────────────┼────────────────────┐
│ │ │
▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐
│ MCP │ │ RSS │ │ 浏览器 │
│ 工具 │ │ 订阅 │ │ 搜索 │
└────┬────┘ └────┬────┘ └────┬────┘
│ │ │
▼ ▼ ▼
API 接口 新闻网站 搜索引擎
数据库 博客 RSS 社交媒体
---
<## id="section-1">🔧 第 1 步:MCP 工具采集</##>
<### id="section-2">什么是 MCP?</###>
MCP (Model Context Protocol) 是 OpenClaw 的工具调用协议,可以调用各种 API 获取数据。
<### id="section-3">配置 MCP 工具</###>
# 1. 查看可用 MCP 工具
mcporter list2. 配置 WebSearch MCP(阿里百炼)
mcporter call WebSearch.bailian_web_search query="AI 最新进展" count=103. 配置代码解释器(数据处理)
mcporter call code_interpreter_mcp.execute_code code="import pandas as pd; ..."
<### id="section-4">数据采集指令模板</###>
你是一个数据采集专家,请使用 MCP 工具帮我采集以下信息:【采集目标】
• 主题:[填写主题,如"AI 大模型 2026 年 3 月更新"]
• 时间范围:[如"最近 7 天"]
• 数量要求:[如"20-30 条"]【采集步骤】
1. 使用 WebSearch 搜索关键词
2. 提取标题、链接、发布时间、摘要
3. 去重并整理为表格
4. 输出 Markdown 格式
【输出格式】
| 标题 | 来源 | 时间 | 链接 |
|------|------|------|------|
| ... | ... | ... | ... |
<### id="section-5">自动化采集脚本</###>
# ~/Desktop/workScript/python/projects/bvm_collect/mcp_collector.py
MCP 自动化采集脚本
import subprocess
import json
from datetime import datetime
class MCPDataCollector:
def __init__(self):
self.results = []
def search(self, query, count=10):
"""使用 MCP WebSearch 搜索"""
cmd = f'mcporter call WebSearch.bailian_web_search query="{query}" count={count}'
result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
return json.loads(result.stdout)
def collect(self, keywords):
"""批量采集"""
for keyword in keywords:
print(f"采集:{keyword}")
data = self.search(keyword)
self.results.extend(data.get('pages', []))
return self.results
def save(self, filename):
"""保存结果"""
with open(filename, 'w', encoding='utf-8') as f:
json.dump(self.results, f, ensure_ascii=False, indent=2)
print(f"已保存 {len(self.results)} 条数据到 {filename}")
使用示例
if __name__ == "__main__":
collector = MCPDataCollector()
keywords = ["OpenClaw 更新", "AI Agent 最新", "大模型发布"]
results = collector.collect(keywords)
collector.save(f"data/mcp_collect_{datetime.now().strftime('%Y%m%d')}.json")
---
<## id="section-6">📰 第 2 步:RSS 订阅采集</##>
<### id="section-7">配置 RSS 订阅源</###>
【推荐 RSS 订阅源】科技新闻:
• CSDN: https://blog.csdn.net/rss/list
• 知乎日报:https://daily.zhihu.com/rss
• 36Kr: https://36kr.com/feedAI 专项:
• OpenAI Blog: https://openai.com/blog/rss
• Anthropic: https://www.anthropic.com/rss
• Google AI: https://ai.google/rss
<### id="section-8">RSS 采集指令</###>
你是一个 RSS 内容分析专家,请帮我处理以下 RSS 订阅内容:【RSS 源】
• [粘贴 RSS 链接或内容]【处理要求】
1. 提取最近 10 篇文章
2. 筛选与"AI Agent"相关的内容
3. 提取标题、链接、发布时间、摘要
4. 按时间倒序排列
【输出格式】
<## id="section-9">📰 [日期] AI Agent 相关新闻##>
<### id="section-10">1. [标题]###>
• 来源:[网站名]
• 时间:[发布时间]
• 摘要:[100 字以内]
• 链接:[URL]
<### id="section-11">RSS 监控脚本</###>
# ~/Desktop/workScript/python/projects/bvm_collect/rss_monitor.py
RSS 监控脚本
import feedparser
import json
from datetime import datetime, timedelta
class RSSMonitor:
def __init__(self):
self.feeds = []
def add_feed(self, url, name):
"""添加 RSS 订阅源"""
self.feeds.append({'url': url, 'name': name})
def fetch_all(self, days=7):
"""获取最近 N 天的内容"""
all_entries = []
cutoff_date = datetime.now() - timedelta(days=days)
for feed in self.feeds:
print(f"抓取:{feed['name']}")
fp = feedparser.parse(feed['url'])
for entry in fp.entries:
try:
published = datetime(*entry.published_parsed[:6])
if published >= cutoff_date:
all_entries.append({
'source': feed['name'],
'title': entry.title,
'link': entry.link,
'published': published.isoformat(),
'summary': entry.summary[:200] if hasattr(entry, 'summary') else ''
})
except:
continue
return sorted(all_entries, key=lambda x: x['published'], reverse=True)
def save(self, entries, filename):
"""保存结果"""
with open(filename, 'w', encoding='utf-8') as f:
json.dump(entries, f, ensure_ascii=False, indent=2)
print(f"已保存 {len(entries)} 条内容")
使用示例
if __name__ == "__main__":
monitor = RSSMonitor()
monitor.add_feed("https://36kr.com/feed", "36Kr")
monitor.add_feed("https://blog.csdn.net/rss/list", "CSDN")
entries = monitor.fetch_all(days=7)
monitor.save(entries, f"data/rss_monitor_{datetime.now().strftime('%Y%m%d')}.json")
---
<## id="section-12">🌐 第 3 步:浏览器搜索采集</##>
<### id="section-13">使用 browser 工具采集</###>
你是一个数据采集专家,请使用 browser 工具帮我采集信息:【采集目标】
• 网站:[如"https://www.huxiu.com/"]
• 主题:[如"AI 相关文章"]
• 数量:[如"10 篇"]【采集步骤】
1. 访问目标网站
2. 搜索关键词或浏览相关分类
3. 提取文章标题、链接、发布时间、摘要
4. 整理为表格
【注意事项】
• 注意反爬机制,控制访问频率
• 提取内容要完整
• 链接要绝对路径
<### id="section-14">浏览器自动化脚本</###>
# ~/Desktop/workScript/python/projects/bvm_collect/browser_collector.py
浏览器自动化采集脚本
from playwright.sync_api import sync_playwright
import json
from datetime import datetime
class BrowserCollector:
def __init__(self, headless=True):
self.headless = headless
self.results = []
def collect(self, url, search_query=None):
"""采集网页内容"""
with sync_playwright() as p:
browser = p.chromium.launch(headless=self.headless)
page = browser.new_page()
# 访问页面
print(f"访问:{url}")
page.goto(url, wait_until='networkidle')
# 如果有搜索词,执行搜索
if search_query:
search_box = page.query_selector('input[type="search"], input[name="q"]')
if search_box:
search_box.fill(search_query)
search_box.press('Enter')
page.wait_for_load_state('networkidle')
# 提取文章列表(根据实际网站结构调整选择器)
articles = page.query_selector_all('article, .post, .news-item')
for article in articles[:10]: # 限制数量
try:
title_el = article.query_selector('h1, h2, h3, a.title')
link_el = article.query_selector('a')
time_el = article.query_selector('time, .date, .publish-time')
summary_el = article.query_selector('p, .summary, .excerpt')
if title_el and link_el:
self.results.append({
'title': title_el.inner_text().strip(),
'link': link_el.get_attribute('href'),
'time': time_el.inner_text().strip() if time_el else '',
'summary': summary_el.inner_text().strip()[:200] if summary_el else ''
})
except Exception as e:
continue
browser.close()
return self.results
def save(self, filename):
"""保存结果"""
with open(filename, 'w', encoding='utf-8') as f:
json.dump(self.results, f, ensure_ascii=False, indent=2)
print(f"已保存 {len(self.results)} 条数据")
使用示例
if __name__ == "__main__":
collector = BrowserCollector(headless=True)
collector.collect("https://www.huxiu.com/", search_query="AI")
collector.save(f"data/browser_collect_{datetime.now().strftime('%Y%m%d')}.json")
---
<## id="section-15">🤖 三合一采集 Agent</##>
<### id="section-16">整合三种采集方式</###>
你是一个全网数据采集 Agent,请整合以下三种方式采集信息:【采集任务】
• 主题:[如"2026 年 3 月 AI 大模型进展"]
• 时间范围:[如"最近 7 天"]
• 目标数量:[如"50 条"]【采集方式】
1. MCP 工具:搜索 20 条
- 使用 WebSearch MCP
- 关键词:[关键词列表]
2. RSS 订阅:监控 10 个来源
- RSS 源:[RSS 链接列表]
- 筛选相关主题
3. 浏览器采集:补充 20 条
- 目标网站:[网站列表]
- 搜索关键词
【去重与整理】
1. 合并三种方式的结果
2. 按标题去重
3. 按时间倒序排列
4. 输出 Markdown 表格
【输出格式】
<## id="section-17">📊 数据采集报告##>
采集时间:[日期]
采集主题:[主题]
数据来源:MCP [X]条 + RSS [X]条 + 浏览器 [X]条
| 标题 | 来源 | 时间 | 类型 | 链接 |
|------|------|------|------|------|
| ... | ... | ... | ... | ... |
<### id="section-18">完整采集工作流</###>
# ~/Desktop/workScript/python/projects/bvm_collect/universal_collector.py
三合一通用采集器
import json
from datetime import datetime
from mcp_collector import MCPDataCollector
from rss_monitor import RSSMonitor
from browser_collector import BrowserCollector
class UniversalDataCollector:
def __init__(self):
self.mcp = MCPDataCollector()
self.rss = RSSMonitor()
self.browser = BrowserCollector(headless=True)
self.all_data = []
def collect_all(self, topic, keywords, rss_feeds, websites):
"""整合三种方式采集"""
print(f"=== 开始采集:{topic} ===")
# 1. MCP 采集
print("\n【1/3】MCP 工具采集...")
mcp_data = self.mcp.collect(keywords)
print(f"MCP 采集:{len(mcp_data)} 条")
# 2. RSS 采集
print("\n【2/3】RSS 订阅采集...")
for url, name in rss_feeds:
self.rss.add_feed(url, name)
rss_data = self.rss.fetch_all(days=7)
print(f"RSS 采集:{len(rss_data)} 条")
# 3. 浏览器采集
print("\n【3/3】浏览器采集...")
browser_data = []
for website in websites:
self.browser.collect(website, search_query=topic)
browser_data.extend(self.browser.results)
print(f"浏览器采集:{len(browser_data)} 条")
# 合并数据
self.all_data = mcp_data + rss_data + browser_data
print(f"\n总计:{len(self.all_data)} 条")
return self.all_data
def deduplicate(self):
"""去重"""
seen_titles = set()
unique_data = []
for item in self.all_data:
title = item.get('title', '')
if title not in seen_titles:
seen_titles.add(title)
unique_data.append(item)
self.all_data = unique_data
print(f"去重后:{len(self.all_data)} 条")
return self.all_data
def save_report(self, topic):
"""生成报告"""
filename = f"data/report_{topic}_{datetime.now().strftime('%Y%m%d')}.md"
with open(filename, 'w', encoding='utf-8') as f:
f.write(f"# 📊 数据采集报告\n\n")
f.write(f"采集时间:{datetime.now().strftime('%Y-%m-%d %H:%M')}\n")
f.write(f"采集主题:{topic}\n")
f.write(f"数据总量:{len(self.all_data)} 条\n\n")
f.write(f"## 数据列表\n\n")
for i, item in enumerate(self.all_data, 1):
f.write(f"### {i}. {item.get('title', '无标题')}\n")
f.write(f"- 来源:{item.get('source', '未知')}\n")
f.write(f"- 时间:{item.get('published', item.get('time', '未知'))}\n")
f.write(f"- 链接:{item.get('link', '无链接')}\n\n")
print(f"报告已保存:{filename}")
使用示例
if __name__ == "__main__":
collector = UniversalDataCollector()
# 配置采集参数
topic = "AI 大模型"
keywords = ["GPT-5", "Claude 4", "Gemini 3"]
rss_feeds = [
("https://36kr.com/feed", "36Kr"),
("https://blog.csdn.net/rss/list", "CSDN")
]
websites = [
"https://www.huxiu.com/",
"https://36kr.com/"
]
# 执行采集
collector.collect_all(topic, keywords, rss_feeds, websites)
collector.deduplicate()
collector.save_report(topic)
---
<## id="section-19">📋 实战案例:监控 OpenClaw 更新</##>
<### id="section-20">配置采集任务</###>
【采集任务】监控 OpenClaw 最新动态【MCP 关键词】
• OpenClaw 更新
• OpenClaw 发布
• OpenClaw version【RSS 订阅源】
• OpenClaw GitHub: https://github.com/openclaw/openclaw/releases.atom
• CSDN OpenClaw: https://so.csdn.net/so/search/rss.do?q=OpenClaw【浏览器采集】
• https://github.com/openclaw/openclaw
• https://docs.openclaw.ai【采集频率】每天上午 9 点
【输出】Markdown 报告 + JSON 数据
<### id="section-21">定时任务配置</###>
# Crontab 配置(每天 9 点执行)
0 9 * cd ~/Desktop/workScript/python/projects/bvm_collect && python3 universal_collector.py >> logs/collector.log 2>&1
---
<## id="section-22">🎯 总结</##>
<### id="section-23">三种采集方式对比</###>
| 方式 | 优点 | 缺点 | 适用场景 |
|------|------|------|---------|
| MCP 工具 | 快速、结构化 | 依赖 API | 搜索引擎、数据库 |
| RSS 订阅 | 实时、稳定 | 需要网站支持 RSS | 新闻网站、博客 |
| 浏览器采集 | 灵活、全面 | 速度慢、易被反爬 | 动态网站、社交媒体 |
<### id="section-24">最佳实践</###>
1. 优先使用 MCP - 快速、稳定
2. RSS 做补充 - 监控固定来源
3. 浏览器兜底 - 采集动态内容
4. 定期去重 - 避免重复数据
5. 保存原始数据 - 便于回溯分析
---
📅 2026-03-31 整理
OCnote Agent 教学 - 数据采集实战系列