Files
Lottery/docs/PRD-20260619-双色球数据抓取系统.md
vincent 13a259b0f8 chore: initial commit — existing lottoData codebase
Files:
- lottery.py (1189 lines) — DoubleColorBallGenerator core engine
- fetch_data.py (131 lines) — history data fetcher from 55128.cn
- web_executor.py (216 lines) — data fetch Web console (Flask :5000)
- app.py (505 lines) — number generation Web service (Flask :8085)
- index.html (1171 lines) — frontend SPA
- web_console.html (323 lines) — fetch console frontend
- deploy/ — systemd service + cron script + logs

BIZ-74 architecture review baseline
2026-07-03 16:39:21 +08:00

15 KiB
Raw Permalink Blame History

产品需求文档(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 配置示例:

# 每天 21:30 执行数据抓取
30 21 * * * cd /home/vincent/Studio/lottoData && /usr/bin/python3 scraper.py >> logs/cron.log 2>&1

Systemd 服务配置(Web 服务):

# /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. 依赖包清单

# requirements.txt
requests==2.31.0
beautifulsoup4==4.12.2
openpyxl==3.1.2
flask==3.0.0
lxml==4.9.3

B. 配置文件示例

# 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
下次评审日期: 开发完成后验收评审