# 产品需求文档(PRD):双色球数据抓取系统
## 版本历史
| 版本 | 日期 | 变更内容 | 作者 |
|------|------|----------|------|
| v1.0 | 2026-06-19 | 初始版本 | 沈路明 |
---
## 1. 背景与目标
### 1.1 业务背景
- 双色球作为中国最受欢迎的彩票类型,用户需要及时了解历史开奖数据进行分析和参考
- 目前数据依赖人工查看,效率低且无法进行数据分析
- 需要建立自动化数据抓取和展示系统,支持日常数据分析和研究
### 1.2 解决的问题
1. **数据获取效率低**:人工访问网站查看开奖结果耗时且容易遗漏
2. **数据难以分析**:网页数据无法直接用于 Excel 或其他分析工具
3. **无法实时监控**:无法及时获取最新开奖数据
4. **访问不便**:需要在局域网内便捷访问数据和管理工具
### 1.3 成功指标(可量化)
- **数据准确性**:抓取数据与官方网站一致率 100%
- **更新及时性**:开奖后 30 分钟内完成数据更新
- **系统可用性**:Web 服务月可用性 ≥ 99%
- **用户体验**:页面加载时间 < 2 秒(局域网环境)
---
## 2. 用户故事
| 角色 | 用户故事 | 价值 |
|------|----------|------|
| 数据分析员 | 作为数据分析员,我希望每天自动获取最新的双色球开奖数据,以便进行趋势分析 | 节省手动收集数据的时间,确保数据完整性 |
| 普通用户 | 作为普通用户,我希望通过网页界面手动触发数据抓取并实时查看结果,以便确认系统正常运行 | 透明化系统运行状态,增强信任感 |
| 系统管理员 | 作为系统管理员,我希望配置定时任务和时间,以便控制数据抓取的频率 | 灵活管理系统负载,避免频繁请求 |
| 局域网用户 | 作为局域网用户,我希望能在家中任何设备上访问 Web 界面,以便随时随地查看数据 | 提升访问便利性,支持多设备使用 |
---
## 3. 功能需求
### 3.1 数据抓取模块
| 功能点 | 描述 | 优先级 | 验收标准 |
|--------|------|--------|----------|
| 数据源接入 | 从 https://www.55128.cn/kjh/fcssq-history-120.htm 抓取近 120 期双色球开奖数据 | P0 | 能正确解析 HTML 并提取所有开奖数据,无遗漏 |
| 增量更新 | 对比本地 Excel 文件,仅添加缺失的期数数据 | P0 | 不产生重复数据,新增数据准确率 100% |
| 数据校验 | 抓取后进行数据完整性校验(期数连续性、号码格式等) | P1 | 发现异常数据时记录错误日志并告警 |
| 错误重试 | 网络异常时自动重试(最多 3 次,间隔 5 秒) | P1 | 临时网络故障下成功抓取率 ≥ 95% |
### 3.2 数据存储模块
| 功能点 | 描述 | 优先级 | 验收标准 |
|--------|------|--------|----------|
| Excel 存储 | 数据以 Excel 格式存储,文件名为「双色球历史数据.xlsx」 | P0 | 文件格式正确,可用 Excel 正常打开 |
| 字段定义 | 包含以下字段(见 4.1) | P0 | 所有字段完整,格式正确 |
| 数据导出 | 支持导出为 CSV 格式(可选) | P2 | 导出数据与 Excel 一致,编码为 UTF-8 |
### 3.3 Web 界面模块
| 功能点 | 描述 | 优先级 | 验收标准 |
|--------|------|--------|----------|
| 手动触发抓取 | 提供"立即抓取"按钮,点击后执行抓取脚本 | P0 | 按钮点击后 3 秒内响应,显示执行状态 |
| 实时日志展示 | 显示抓取过程的实时日志(包括开始时间、抓取期数、完成时间等) | P0 | 日志自动滚动,支持暂停查看,颜色区分正常/警告/错误 |
| 数据概览 | 展示最新一期开奖号码(红球 6 个 + 蓝球 1 个) | P0 | 号码以球状展示,颜色正确(红球红色,蓝球蓝色) |
| 历史数据表 | 展示 Excel 中的数据,支持分页和搜索 | P1 | 支持按期数搜索,分页加载(每页 20 条) |
| 抓取状态监控 | 显示最近一次抓取时间、下次计划抓取时间、抓取状态(成功/失败) | P1 | 状态更新时间 < 5 秒延迟 |
| 定时任务配置 | 提供界面配置定时任务的执行时间 | P0 | 配置后立即生效,无需重启服务 |
| 响应式布局 | 支持桌面端和移动端访问 | P1 | 在主流手机浏览器上正常显示和操作 |
### 3.4 定时任务模块
| 功能点 | 描述 | 优先级 | 验收标准 |
|--------|------|--------|----------|
| Cron 定时任务 | 使用 Linux cron 实现每天自动抓取 | P0 | 任务配置正确,日志中可查到执行记录 |
| 执行时间配置 | 默认为每天 21:30(开奖后 15 分钟) | P0 | 可通过 Web 界面修改执行时间 |
| 任务开关 | 提供启用/禁用定时任务的开关 | P1 | 开关状态立即生效,界面显示当前状态 |
---
## 4. 非功能需求
### 4.1 数据字段定义
**Excel 文件字段:**
| 字段名 | 类型 | 说明 | 示例 |
|--------|------|------|------|
| 开奖日期 | Date | 开奖日期 | 2026-06-18 |
| 期数 | String | 双色球期号 | 2026069 |
| 红球 1 | Integer | 第 1 个红球号码(1-33) | 12 |
| 红球 2 | Integer | 第 2 个红球号码(1-33) | 14 |
| 红球 3 | Integer | 第 3 个红球号码(1-33) | 16 |
| 红球 4 | Integer | 第 4 个红球号码(1-33) | 17 |
| 红球 5 | Integer | 第 5 个红球号码(1-33) | 18 |
| 红球 6 | Integer | 第 6 个红球号码(1-33) | 32 |
| 蓝球 | Integer | 蓝球号码(1-16) | 08 |
| 和值 | Integer | 6 个红球号码之和 | 109 |
| 奇偶比 | String | 红球奇偶比例 | 1:5 |
| 大小比 | String | 红球大小比例(1-16 为小,17-33 为大) | 3:3 |
| 开机号 | String | 开机号(如有) | 07,13,19,24,27,31+05 |
| 跨度 | Integer | 红球最大值 - 最小值 | 20 |
### 4.2 性能要求
| 指标 | 要求 | 说明 |
|------|------|------|
| 抓取耗时 | < 30 秒 | 完成 120 期数据抓取和更新的总耗时 |
| 页面加载 | < 2 秒 | Web 界面在局域网环境下的加载时间 |
| 并发支持 | ≥ 5 个并发用户 | 支持至少 5 个用户同时访问 Web 界面 |
| 内存占用 | < 200MB | Python 进程常驻内存占用 |
### 4.3 兼容性要求
| 维度 | 要求 |
|------|------|
| 操作系统 | Ubuntu 20.04+ / macOS 12+ |
| Python 版本 | Python 3.8+ |
| 浏览器 | Chrome 90+、Firefox 88+、Safari 14+、Edge 90+ |
| 移动端 | iOS Safari 14+、Android Chrome 90+ |
### 4.4 安全要求
**局域网访问安全:**
| 安全项 | 方案 | 说明 |
|--------|------|------|
| 访问控制 | 仅监听 0.0.0.0,通过防火墙限制访问来源 | 只允许内网 IP 段访问(如 192.168.0.0/16) |
| 身份验证 | 可选配置基本 HTTP 认证(用户名 + 密码) | 防止未授权访问,密码通过配置文件管理 |
| 日志记录 | 所有访问和操作记录日志 | 包含时间、IP、操作类型、结果 |
| 命令注入防护 | Web 界面不接受任何命令行输入 | 防止用户通过界面执行任意命令 |
### 4.5 可靠性要求
| 指标 | 要求 | 说明 |
|------|------|------|
| 服务可用性 | ≥ 99% | 月累计不可用时间 < 7.2 小时 |
| 数据持久化 | 100% | 已抓取数据不丢失,异常情况自动备份 |
| 断电恢复 | 自动恢复服务 | 系统重启后服务自动拉起(通过 systemd) |
---
## 5. 系统架构设计
### 5.1 技术选型
| 模块 | 技术栈 | 选型理由 |
|------|--------|----------|
| 数据抓取 | Python + requests + BeautifulSoup4 | 成熟的网页抓取方案,社区支持好 |
| 数据存储 | openpyxl | 原生支持 Excel 读写,无需安装 Office |
| Web 服务 | Flask | 轻量级,易部署,适合内部工具 |
| 定时任务 | Linux Cron | 系统原生支持,稳定可靠 |
| 前端 | HTML + CSS + JavaScript (jQuery) | 简单直接,无需构建流程 |
| 日志 | Python logging | 标准库支持,灵活配置 |
### 5.2 目录结构
```
/home/vincent/Studio/lottoData/
├── lottery.py # 号码生成器(现有)
├── 双色球历史数据.xlsx # 数据存储(现有)
├── scraper.py # 数据抓取脚本(新建)
├── app.py # Flask Web 应用(新建)
├── config.py # 配置文件(新建)
├── templates/ # HTML 模板(新建)
│ └── index.html
├── static/ # 静态资源(新建)
│ ├── css/
│ └── js/
├── logs/ # 日志目录(新建)
│ └── lottery.log
└── requirements.txt # Python 依赖(新建)
```
### 5.3 定时任务配置
**Cron 配置示例:**
```bash
# 每天 21:30 执行数据抓取
30 21 * * * cd /home/vincent/Studio/lottoData && /usr/bin/python3 scraper.py >> logs/cron.log 2>&1
```
**Systemd 服务配置(Web 服务):**
```ini
# /etc/systemd/system/lottery-web.service
[Unit]
Description=Lottery Data Web Service
After=network.target
[Service]
Type=simple
User=vincent
WorkingDirectory=/home/vincent/Studio/lottoData
ExecStart=/usr/bin/python3 app.py
Restart=always
[Install]
WantedBy=multi-user.target
```
### 5.4 页面流程图
```
用户访问 Web 界面
↓
加载首页(显示最新开奖数据 + 历史数据)
↓
┌──────────────┬──────────────┬──────────────┐
│ │ │ │
▼ ▼ ▼ ▼
手动触发抓取 查看历史数据 配置定时任务 监控抓取状态
↓ ↓ ↓ ↓
显示执行日志 分页/搜索查看 修改执行时间 查看上次抓取结果
↓ ↓ ↓ ↓
更新数据表 导出数据 保存配置 显示下次执行时间
```
---
## 6. 接口设计
### 6.1 Web 接口
| 接口路径 | 方法 | 描述 | 请求参数 | 返回格式 |
|----------|------|------|----------|----------|
| `/` | GET | 首页 - 数据展示 | 无 | HTML |
| `/api/scrape` | POST | 手动触发抓取 | 无 | JSON `{"status": "success", "message": "..."}` |
| `/api/status` | GET | 获取系统状态 | 无 | JSON `{last_scrape_time, next_scheduled_time, status}` |
| `/api/history` | GET | 获取历史数据 | `page`, `limit`, `search` | JSON `{"data": [...], "total": N}` |
| `/api/config` | GET | 获取定时任务配置 | 无 | JSON |
| `/api/config` | POST | 更新定时任务配置 | `enabled`, `cron_expr` | JSON `{"status": "success"}` |
### 6.2 日志格式
```
[2026-06-19 21:30:01 INFO] 开始抓取数据...
[2026-06-19 21:30:02 INFO] 成功访问数据源页面
[2026-06-19 21:30:05 INFO] 解析到 120 条数据
[2026-06-19 21:30:06 INFO] 本地现有数据:118 条
[2026-06-19 21:30:06 INFO] 新增数据:2 条 (2026069, 2026068)
[2026-06-19 21:30:07 INFO] 数据保存到 Excel 成功
[2026-06-19 21:30:07 INFO] 抓取完成,耗时 6.2 秒
```
---
## 7. 排期建议
### 7.1 开发阶段划分
| 阶段 | 任务 | 预计耗时 | 依赖 |
|------|------|----------|------|
| 阶段 1 | 数据抓取脚本开发(scraper.py) | 2 小时 | 无 |
| 阶段 2 | Web 服务开发(app.py + templates) | 3 小时 | 阶段 1 完成 |
| 阶段 3 | 定时任务配置和系统部署 | 1 小时 | 阶段 2 完成 |
| 阶段 4 | 测试和优化 | 2 小时 | 阶段 3 完成 |
**总预计耗时:8 小时**
### 7.2 关键依赖
1. **服务器访问权限**:需要能访问目标网站(55128.cn)
2. **Python 环境**:需要安装 Python 3.8+ 和依赖包
3. **局域网网络**:确保局域网内设备可以访问服务端口
---
## 8. 风险与应对
### 8.1 需求风险
| 风险 | 影响 | 概率 | 应对方案 |
|------|------|------|----------|
| 数据源网站结构变化 | 抓取脚本失效 | 中 | 1. 添加结构变更检测
2. 建立告警机制
3. 定期维护更新 |
| 数据源网站反爬策略 | 被封 IP | 低 | 1. 控制请求频率
2. 添加 User-Agent
3. 必要时使用代理 |
### 8.2 技术风险
| 风险 | 影响 | 概率 | 应对方案 |
|------|------|------|----------|
| Excel 文件被占用 | 写入失败 | 低 | 1. 写入前检查文件锁
2. 使用临时文件 + 原子替换
3. 失败后重试 |
| 网络不稳定 | 抓取失败 | 中 | 1. 实现重试机制
2. 记录失败原因
3. 邮件/消息告警 |
| 端口冲突 | Web 服务启动失败 | 低 | 1. 启动前检查端口占用
2. 支持配置端口
3. 日志明确提示 |
### 8.3 安全风险
| 风险 | 影响 | 概率 | 应对方案 |
|------|------|------|----------|
| 未授权访问 | 数据泄露 | 中 | 1. 防火墙限制 IP 范围
2. 可选 HTTP 认证
3. 访问日志审计 |
| 恶意请求 | 服务崩溃 | 低 | 1. 请求频率限制
2. 异常输入过滤
3. 服务监控 |
---
## 9. 验收标准
### 9.1 功能验收
- [ ] **数据抓取**:能从 55128.cn 成功抓取近 120 期数据
- [ ] **增量更新**:不产生重复数据,仅添加缺失期数
- [ ] **Web 界面**:能手动触发抓取并实时查看日志
- [ ] **数据展示**:首页展示最新开奖号码和历史数据表
- [ ] **定时任务**:配置 cron 后每天自动执行
- [ ] **局域网访问**:其他设备能访问 Web 服务
### 9.2 质量验收
- [ ] **数据准确性**:与官方网站数据 100% 一致
- [ ] **性能达标**:页面加载时间 < 2 秒(局域网)
- [ ] **日志完整**:所有关键操作都有日志记录
- [ ] **错误处理**:异常情况有明确提示和日志
### 9.3 文档验收
- [ ] **README 文档**:包含安装、配置、使用说明
- [ ] **依赖清单**:requirements.txt 完整列出 Python 依赖
- [ ] **部署文档**:Systemd 服务配置说明
---
## 10. 后续优化建议
### 10.1 短期优化(1 个月内)
1. **数据可视化**:增加号码分布图、冷热号统计等图表
2. **告警通知**:抓取失败时通过邮件/微信通知
3. **数据备份**:每天自动备份 Excel 文件到云存储
### 10.2 中期优化(3 个月内)
1. **数据库升级**:使用 SQLite/MySQL 替代 Excel,支持更复杂查询
2. **API 开放**:提供 REST API 供其他系统调用
3. **多彩种支持**:扩展支持大乐透、福彩 3D 等其他彩票
### 10.3 长期优化(6 个月内)
1. **数据分析平台**:集成数据分析工具,提供智能预测
2. **移动端 App**:开发 iOS/Android 应用
3. **多用户系统**:支持多个用户独立配置和使用
---
## 附录
### A. 依赖包清单
```txt
# requirements.txt
requests==2.31.0
beautifulsoup4==4.12.2
openpyxl==3.1.2
flask==3.0.0
lxml==4.9.3
```
### B. 配置文件示例
```python
# config.py
import os
# 系统配置
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
DATA_FILE = os.path.join(BASE_DIR, '双色球历史数据.xlsx')
LOG_FILE = os.path.join(BASE_DIR, 'logs', 'lottery.log')
# 数据源
DATA_SOURCE_URL = 'https://www.55128.cn/kjh/fcssq-history-120.htm'
# Web 服务配置
WEB_HOST = '0.0.0.0'
WEB_PORT = 5000
DEBUG = False
# 定时任务配置
CRON_ENABLED = True
CRON_EXPR = '30 21 * * *' # 每天 21:30
# 安全配置(可选)
AUTH_ENABLED = False
AUTH_USERNAME = 'admin'
AUTH_PASSWORD = 'your_password_here' # 建议通过环境变量设置
```
### C. 数据来源说明
- **数据源**:彩吧助手 (www.55128.cn)
- **数据更新时间**:每周二、四、日 21:15 开奖
- **建议抓取时间**:开奖后 15 分钟(21:30)
---
**PRD 评审人:** 承哥
**PRD 创建日期:** 2026-06-19
**下次评审日期:** 开发完成后验收评审