Files
website/NEWS_SYSTEM_README.md
2025-12-02 20:11:38 +08:00

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

脚本会自动检查环境、依赖,并提供以下选项:

  1. 运行爬虫 (抓取最新新闻)
  2. 导出数据为 JSON
  3. 爬取并导出 ⭐ 推荐选项
  4. 查看数据库统计
  5. 启动爬虫服务
  6. 退出

方法二:手动运行命令

# 进入爬虫服务目录
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)

功能特性

  1. 分类筛选 - 7个分类标签快速切换
  2. 搜索功能 - 全文搜索标题、内容、标签
  3. 多种排序 - 按发布时间、浏览量、重要性排序
  4. 视图切换 - 网格视图 / 列表视图
  5. 热门新闻 - 独立展示热门资讯
  6. 统计面板 - 实时显示新闻数量、来源统计
  7. 无限滚动 - 支持分页加载更多
  8. 响应式设计 - 完美适配各种屏幕尺寸

新闻卡片信息

  • 标题 - 新闻标题
  • 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: 爬虫抓取失败

症状: 运行爬虫后没有新数据

排查步骤:

  1. 检查网络连接
  2. 验证RSS源是否可访问
  3. 查看日志文件 logs/app.log
  4. 检查数据库连接

解决方案:

# 测试网络连接
curl https://vcbeat.top/rss

# 查看详细日志
tail -100 news-crawler-service/logs/app.log

问题2: AI摘要生成失败

症状: 摘要内容是简单的句子提取

排查步骤:

  1. 检查Ollama服务是否运行
  2. 验证模型是否已下载
  3. 检查OLLAMA_URL配置

解决方案:

# 启动Ollama服务
ollama serve

# 下载模型
ollama pull qwen3:32b

# 测试API
curl http://localhost:11434/api/tags

问题3: 前端无法显示新闻

症状: 业界动态页面为空

排查步骤:

  1. 检查 public/data/news.json 是否存在
  2. 验证JSON文件格式是否正确
  3. 检查浏览器控制台错误

解决方案:

# 重新导出数据
cd news-crawler-service
npm run export

# 验证JSON文件
cat ../public/data/news.json | jq 'length'

问题4: 爬虫服务启动失败

症状: npm start 报错

排查步骤:

  1. 检查端口3001是否被占用
  2. 验证环境变量配置
  3. 检查依赖是否完整安装

解决方案:

# 检查端口占用
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条)
  • 响应式图片

🔐 安全建议

  1. 修改默认API密钥

    API_KEY=your_secure_random_key_here
    
  2. 配置CORS白名单

    CORS_ORIGIN=https://yourdomain.com
    
  3. 使用HTTPS

    • 部署时配置SSL证书
    • 强制HTTPS重定向
  4. 限制API请求频率

    • 添加rate limiting中间件
    • 防止恶意爬取
  5. 定期备份数据库

    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: "爬取并导出"

祝使用愉快! 🚀