14 KiB
📰 OmniVerse 新闻爬虫系统使用指南
🎯 系统概述
OmniVerse 新闻爬虫系统是一个功能完善的自动化新闻抓取、分类、AI摘要生成和展示系统。系统从多个权威医疗健康资讯源自动抓取相关新闻,通过AI生成智能摘要,并在前端页面展示。
核心特性
✅ 自动化RSS抓取 - 定时从17+个医疗健康领域RSS源抓取新闻 ✅ 智能分类 - 使用关键词权重算法自动分类新闻 ✅ AI摘要生成 - 集成Ollama本地大模型生成新闻摘要 ✅ 定时任务 - 支持定时爬取和数据清理 ✅ 数据导出 - 自动将数据导出为JSON供前端使用 ✅ 精美前端 - 响应式设计,支持多种浏览模式
📊 新闻分类体系
系统支持以下6大新闻分类:
| 分类ID | 中文名称 | 说明 | 图标 |
|---|---|---|---|
healthcare-policy |
康养政策 | 政策法规、行业标准、监管动态 | 🏥 |
medical-robotics |
医疗机器人 | 手术机器人、康复机器人、护理机器人 | 🤖 |
smart-elderly-care |
智慧养老 | 养老科技、护理创新、银发经济 | 👴 |
tech-innovation |
技术前沿 | AI医疗、数字健康、创新技术 | 🚀 |
investment |
投融资 | 投资动态、融资消息、市场估值 | 💰 |
industry-trends |
行业动态 | 市场分析、发展趋势、行业报告 | 📈 |
🔧 快速开始
方法一:使用验证脚本(推荐)
# 运行交互式验证脚本
./verify-news.sh
脚本会自动检查环境、依赖,并提供以下选项:
- 运行爬虫 (抓取最新新闻)
- 导出数据为 JSON
- 爬取并导出 ⭐ 推荐选项
- 查看数据库统计
- 启动爬虫服务
- 退出
方法二:手动运行命令
# 进入爬虫服务目录
cd news-crawler-service
# 安装依赖
npm install
# 运行爬虫并导出数据
npm run crawl-and-export
# 或分步执行
npm run crawler # 抓取新闻
npm run export # 导出为JSON
🌐 启动爬虫服务
启动API服务
cd news-crawler-service
npm start
服务将在 http://localhost:3001 启动
启动前端开发服务器
# 在项目根目录
npm run dev
前端将在 http://localhost:5174 启动
访问业界新闻页面:
http://localhost:5174/website/industry-news
或
http://192.168.1.83:5174/website/industry-news
📡 API 端点
获取新闻列表
GET /api/news?page=1&limit=12&category=tech-innovation&sortBy=publishedAt
查询参数:
page- 页码 (默认: 1)limit- 每页条数 (默认: 10, 最大: 50)category- 分类过滤query- 搜索关键词sortBy- 排序字段 (publishedAt/viewCount/priority)sortOrder- 排序方向 (DESC/ASC)
获取热门新闻
GET /api/news/hot?limit=5
获取统计信息
GET /api/stats
手动触发爬取
POST /api/crawl
Headers: X-API-Key: omniverse_news_2024
获取新闻分类
GET /api/categories
健康检查
GET /health
⚙️ 配置说明
环境变量配置 (.env)
# 服务器设置
PORT=3001
NODE_ENV=development
# 数据库路径
DATABASE_PATH=./data/news.db
# 爬虫设置
CRAWL_INTERVAL_MINUTES=30 # 爬取间隔(分钟)
MAX_NEWS_AGE_DAYS=7 # 新闻保留天数
ENABLE_SCHEDULER=true # 启用定时任务
# 缓存设置
CACHE_TTL_SECONDS=300 # 缓存有效期(秒)
# API设置
API_KEY=omniverse_news_2024 # API密钥
CORS_ORIGIN=http://localhost:5173,http://localhost:5174,http://192.168.1.83:5174
# 日志设置
LOG_LEVEL=info
LOG_FILE=./logs/app.log
# Ollama AI 设置
OLLAMA_URL=http://localhost:11434
OLLAMA_MODEL=qwen3:32b # 使用的AI模型
# 导出设置
AUTO_EXPORT_JSON=true # 爬取后自动导出JSON
🤖 AI 摘要功能
系统使用 Ollama 本地大模型生成新闻摘要。
安装 Ollama
# macOS
brew install ollama
# Linux
curl -fsSL https://ollama.ai/install.sh | sh
# Windows
# 从 https://ollama.ai 下载安装包
下载并启动模型
# 下载 qwen3:32b 模型(推荐)
ollama pull qwen3:32b
# 或使用其他中文模型
ollama pull qwen:7b
ollama pull glm4:9b
# 启动 Ollama 服务
ollama serve
验证 Ollama 服务
curl http://localhost:11434/api/tags
注意: 如果 Ollama 服务未启动,爬虫仍会正常工作,但会使用备用摘要生成算法(提取前几句话)。
📁 数据存储
SQLite 数据库
位置: news-crawler-service/data/news.db
表结构:
CREATE TABLE news (
id TEXT PRIMARY KEY, -- UUID
title TEXT NOT NULL, -- 标题
summary TEXT, -- AI摘要
content TEXT, -- Markdown内容
category TEXT NOT NULL, -- 分类
tags TEXT, -- JSON数组
source TEXT NOT NULL, -- 来源
source_url TEXT NOT NULL, -- 原文链接
published_at TEXT NOT NULL, -- 发布时间
crawled_at TEXT NOT NULL, -- 抓取时间
author TEXT, -- 作者
image_url TEXT, -- 图片URL
priority TEXT, -- 优先级 (high/medium/low)
region TEXT, -- 地区
is_hot INTEGER, -- 是否热门
view_count INTEGER, -- 浏览量
created_at DATETIME, -- 创建时间
updated_at DATETIME -- 更新时间
);
JSON 导出文件
位置: public/data/news.json
格式示例:
[
{
"id": "uuid-here",
"title": "新闻标题",
"summary": "AI生成的摘要...",
"content": "Markdown格式的完整内容",
"category": "medical-robotics",
"tags": ["机器人", "手术", "创新"],
"source": "动脉网",
"sourceUrl": "https://...",
"publishedAt": "2025-10-06T07:00:00.000Z",
"crawledAt": "2025-10-06T12:51:54.926Z",
"author": "作者名",
"imageUrl": "https://...",
"priority": "high",
"region": "全国",
"isHot": true,
"viewCount": 1500
}
]
📰 RSS 新闻源列表
系统监控以下17个医疗健康领域的权威新闻源:
综合科技类
- 36氪 - 投资融资动态
- 亿欧网 - 行业趋势分析
- 雷锋网 - AI技术创新
- 机器之心 - AI医疗前沿
医疗专业类
- 动脉网 - 医疗机器人与创新
- 医谷 - 医疗器械设备
- 器械之家 - 医疗器械行业
- 医学界 - 医学政策与研究
- 医信邦 - 数字医疗
- 医疗器械创新网 - 器械技术创新
政策法规类
- 健康界 - 政策法规
- 丁香园 - 医疗监管
- 医药网 - 医药政策
技术研发类
- 生物谷 - 生物技术研究
- CPhI制药在线 - 制药创新
养老护理类
- 康复医学网 - 康复机器人
- 养老网 - 智慧养老
🎨 前端页面功能
业界动态页面 (/industry-news)
功能特性
- 分类筛选 - 7个分类标签快速切换
- 搜索功能 - 全文搜索标题、内容、标签
- 多种排序 - 按发布时间、浏览量、重要性排序
- 视图切换 - 网格视图 / 列表视图
- 热门新闻 - 独立展示热门资讯
- 统计面板 - 实时显示新闻数量、来源统计
- 无限滚动 - 支持分页加载更多
- 响应式设计 - 完美适配各种屏幕尺寸
新闻卡片信息
- 标题 - 新闻标题
- AI摘要 - 智能生成的摘要
- 图片 - 新闻配图
- 分类标签 - 所属分类
- 标签云 - 关键词标签
- 发布时间 - 相对时间显示
- 浏览量 - 阅读统计
- 来源 - 新闻来源网站
- 优先级 - 重要程度标记
- 热门标记 - 热门新闻标识
🔄 定时任务
系统支持两个定时任务:
1. 定时爬取任务
// 每30分钟运行一次(可配置)
cron.schedule(`*/${CRAWL_INTERVAL_MINUTES} * * * *`, async () => {
// 爬取新闻
// 自动导出JSON
});
2. 清理旧数据任务
// 每天凌晨2点运行
cron.schedule('0 2 * * *', async () => {
// 删除7天前的新闻(可配置)
});
📈 使用流程
完整工作流程
1. RSS源监控
↓
2. 内容抓取与解析
↓
3. 关键词匹配与过滤
↓
4. 智能分类
↓
5. AI摘要生成
↓
6. 存储到数据库
↓
7. 导出为JSON
↓
8. 前端页面展示
日常维护操作
# 1. 手动触发一次完整爬取
cd news-crawler-service
npm run crawl-and-export
# 2. 查看数据库统计
sqlite3 news-crawler-service/data/news.db "SELECT category, COUNT(*) FROM news GROUP BY category;"
# 3. 查看最新新闻
sqlite3 news-crawler-service/data/news.db "SELECT title, source, published_at FROM news ORDER BY published_at DESC LIMIT 10;"
# 4. 清理旧数据
node news-crawler-service/src/crawler.js cleanup
# 5. 查看日志
tail -f news-crawler-service/logs/app.log
🐛 故障排查
问题1: 爬虫抓取失败
症状: 运行爬虫后没有新数据
排查步骤:
- 检查网络连接
- 验证RSS源是否可访问
- 查看日志文件
logs/app.log - 检查数据库连接
解决方案:
# 测试网络连接
curl https://vcbeat.top/rss
# 查看详细日志
tail -100 news-crawler-service/logs/app.log
问题2: AI摘要生成失败
症状: 摘要内容是简单的句子提取
排查步骤:
- 检查Ollama服务是否运行
- 验证模型是否已下载
- 检查OLLAMA_URL配置
解决方案:
# 启动Ollama服务
ollama serve
# 下载模型
ollama pull qwen3:32b
# 测试API
curl http://localhost:11434/api/tags
问题3: 前端无法显示新闻
症状: 业界动态页面为空
排查步骤:
- 检查
public/data/news.json是否存在 - 验证JSON文件格式是否正确
- 检查浏览器控制台错误
解决方案:
# 重新导出数据
cd news-crawler-service
npm run export
# 验证JSON文件
cat ../public/data/news.json | jq 'length'
问题4: 爬虫服务启动失败
症状: npm start 报错
排查步骤:
- 检查端口3001是否被占用
- 验证环境变量配置
- 检查依赖是否完整安装
解决方案:
# 检查端口占用
lsof -i :3001
# 重新安装依赖
rm -rf node_modules package-lock.json
npm install
# 检查环境配置
cat .env
📝 开发指南
添加新的RSS源
编辑 news-crawler-service/src/crawlers/rss-crawler.js:
this.sources = [
// ... 现有源
{
name: '新闻源名称',
url: 'https://example.com/rss',
category: 'tech-innovation', // 默认分类
keywords: ['关键词1', '关键词2', '关键词3'],
priority: 'high', // high/medium/low
region: '全国'
}
];
修改分类规则
编辑智能分类算法权重:
// rss-crawler.js - smartCategorize() 方法
const categoryRules = {
'your-category': {
keywords: {
'high': ['重要关键词1', '重要关键词2'],
'medium': ['一般关键词1', '一般关键词2'],
'low': ['次要关键词1', '次要关键词2']
},
titleWeight: 5, // 标题权重
contentWeight: 3 // 内容权重
}
};
自定义前端样式
编辑 src/pages/IndustryNews.tsx:
const newsCategories = [
{
value: 'new-category',
label: '新分类',
icon: '🎯',
color: 'from-blue-500 to-cyan-500'
}
];
🚀 部署建议
生产环境配置
# 1. 修改环境变量
NODE_ENV=production
ENABLE_SCHEDULER=true
CRAWL_INTERVAL_MINUTES=30
MAX_NEWS_AGE_DAYS=30
AUTO_EXPORT_JSON=true
# 2. 使用PM2管理进程
npm install -g pm2
pm2 start news-crawler-service/src/server.js --name omniverse-news
# 3. 配置开机自启
pm2 startup
pm2 save
# 4. 查看日志
pm2 logs omniverse-news
Docker 部署
项目已包含 docker-compose.yml 配置:
# 启动服务
docker-compose up -d
# 查看日志
docker-compose logs -f news-crawler
# 停止服务
docker-compose down
📊 性能优化
缓存策略
- API响应缓存: 5分钟 (可配置)
- 前端数据缓存: 5分钟
- 数据库索引: category, published_at, source
爬取优化
- 并发爬取: 顺序执行 + 2秒延迟
- 去重检查: source_url唯一性
- 增量更新: 仅抓取新内容
前端优化
- 图片懒加载
- 虚拟列表滚动
- 分页加载 (每页12条)
- 响应式图片
🔐 安全建议
-
修改默认API密钥
API_KEY=your_secure_random_key_here -
配置CORS白名单
CORS_ORIGIN=https://yourdomain.com -
使用HTTPS
- 部署时配置SSL证书
- 强制HTTPS重定向
-
限制API请求频率
- 添加rate limiting中间件
- 防止恶意爬取
-
定期备份数据库
cp news-crawler-service/data/news.db backups/news_$(date +%Y%m%d).db
📞 技术支持
- 项目地址:
/Users/brunogao/work/codes/web/omniverse-website - 问题反馈: 提交 Issue 或 Pull Request
- 文档更新: 2025-11-17
🎉 总结
OmniVerse 新闻爬虫系统已完成优化,现在可以:
✅ 自动从17+个医疗健康领域RSS源抓取新闻 ✅ 使用AI智能生成新闻摘要 ✅ 自动分类并存储到数据库 ✅ 定时任务自动运行 ✅ 导出JSON供前端使用 ✅ 精美的前端展示页面
立即开始使用:
./verify-news.sh
选择选项3: "爬取并导出"
祝使用愉快! 🚀