Skip to content

milkoor/football-system

Repository files navigation

⚽ 足球数据分析系统

一站式足球数据采集→量化分析→决策信号生成平台。爬取 titan007 公开赛程与赔率数据,计算 X 值,执行 ETL 分析并生成决策报表。


架构

┌─────────────────────────────────────────────────────────────┐
│ 系统 A (FastAPI + PostgreSQL :8000)                         │
│  数据层:爬虫 → 标准化 → 存储 → REST API                     │
│                                                             │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────┐  │
│  │ League   │  │ Season   │  │ Match    │  │ Odds     │  │
│  │ Crawler  │─▶│ Manager  │─▶│ Schedule │─▶│ Crawler  │  │
│  └──────────┘  └──────────┘  └──────────┘  └──────────┘  │
│                                     ↓                       │
│                              ┌──────────┐                  │
│                              │PostgreSQL│                  │
│                              └──────────┘                  │
└───────────────────────────────┬─────────────────────────────┘
                                │ REST API
┌───────────────────────────────▼─────────────────────────────┐
│ 系统 B (Streamlit + SQLite :8501)                           │
│  分析层:关注管理 → 同步 → X值计算 → ETL → 报表             │
│                                                             │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────┐  │
│  │ 系统同步  │  │ 数据导入  │  │ ETL执行  │  │ 报表看板  │  │
│  │ (赛季标签)│─▶│ (比赛+赔率)│─▶│ (分组+决策)│─▶│ (信号)   │  │
│  └──────────┘  └──────────┘  └──────────┘  └──────────┘  │
│                                     ↓                       │
│                              ┌──────────┐                  │
│                              │ SQLite   │                  │
│                              │ (量化数据)│                  │
│                              └──────────┘                  │
└─────────────────────────────────────────────────────────────┘

前置要求

  • Docker & Docker Compose
  • 4GB+ 可用内存
  • 可访问 titan007.com 的网络(爬虫需抓取其公开数据)

一键启动

# Linux/Mac
./start.sh

# Windows
双击 start.bat
服务 地址
系统 A API http://localhost:8000
系统 B 前端 http://localhost:8501
PostgreSQL localhost:5432

使用流程

标准工作流

系统同步                 数据导入                    ETL执行 / 报表看板
┌──────────┐    ┌──────────────────────┐    ┌────────────────────┐
│ 一键同步  │───▶│ 1. 关注联赛/赛季      │───▶│ 1. 快速配置分组     │
│ (赛季标签) │    │ 2. 完整同步(赛程+赔率) │    │ 2. 执行ETL         │
│          │    │ 3. 仅导入(跳过爬虫)   │    │ 3. 报表看板查信号   │
└──────────┘    └──────────────────────┘    └────────────────────┘

详细操作步骤

  1. 系统同步 — 点击「一键同步」创建全部联赛的赛季标签(≈14秒)
  2. 数据导入 — 添加关注联赛/赛季
  3. 完整同步 — 自动三步:赛程→赔率→X值计算(约几分钟,视数据量)
  4. ETL执行 — 先点「快速配置」建分组→执行ETL
  5. 报表看板 — 查看决策信号

核心功能

系统 A — 数据基础设施

功能 说明
🕷️ 联赛爬虫 从 titan007 抓取联赛列表、赛季赛程
📊 赔率爬虫 抓取每场比赛的盘口变动数据(AH/OU)
🔄 数据标准化 队名简繁转换、盘口标准化
🎛️ 管理后台 配置管理、爬虫任务监控
🧹 智能跳过 已完成比赛自动跳过爬取

系统 B — 量化分析平台

功能 说明
🏷️ 赛季标签管理 一次 HTTP 请求获取全部 979 联赛 × 所有赛季
📥 数据导入 关注管理 + 批量导入比赛/X值到本地 SQLite
🧮 X 值计算 从早盘→即时盘赔率波动计算 X 值
⚙️ ETL 管线 X 值分类→轮次聚合→五大区间→护级→强度→信号生成
📊 报表看板 按分组/玩法/时段展示决策信号
⏰ 自动同步 APScheduler 定时同步关注联赛数据

项目结构

football_system/
├── system_a/                  # 数据层
│   ├── scraper/               # 爬虫(league_crawler, odds_crawler)
│   ├── api/routes/            # REST API(leagues, matches, odds, crawl, x_values, settlement)
│   ├── config/                # 配置 + 数据库模型
│   └── admin/                 # 管理后台
│
├── system_b/                  # 分析层
│   ├── app_pages/             # Streamlit 页面(system_sync, data_importer, etl_exec...)
│   ├── original_pages/        # 页面实际实现
│   ├── modules/               # 核心模块(auto_sync, x_calculator, data_connector)
│   ├── core/                  # ETL pipeline, config_store, models
│   └── utils/                 # 工具函数(system_a_mapper)
│
├── e2e_test.py                # 基础 E2E 测试(31 项)
├── e2e_full_flow.py           # 全流程冒烟测试(26 项)
├── docker-compose.yml         # Docker 编排
├── start.sh / start.bat       # 启动脚本
└── stop.sh / stop.bat         # 停止脚本

测试

# 基础 E2E 测试(API + 核心模块)
python3 e2e_test.py

# 全流程冒烟测试(sync→import→ETL→dashboard)
python3 e2e_full_flow.py

# 系统 A 测试
cd system_a && pytest

# 系统 B 测试
cd system_b && bash run_tests.sh

版本历史

v1.2.0 (2026-05-24)

Bug Fixes

  • 日職聯(JLeague) ETL 流程完整修復(結算→導入→分組→計算)
  • 快速配置按鈕判定改為逐聯賽檢查隊伍內容而非僅檢查資料列存在
  • 隊伍分組均分至各群組(Top/Mid/Weak),而非全部分配到同一群組
  • 上賽季分組未配置問題修復(current/previous 角色同時配置)
  • 歷史紀錄「檢視」按鈕功能修復(移除多餘 rerun)
  • 洲別未正確映射問題修復(意甲等聯賽顯示「其他」而非「歐洲」)
  • 賽季 year_start 改為動態獲取(datetime.now().year),避免硬編碼

Features

  • 結算模組整合:System A 自動結算後導入 System B,ETL 區間統計不再全零
  • 賽季同步擴充:支援 SubLeague 歷史賽季 JS 檔案發現(多目錄格式)
  • 賠率爬蟲 ThreadPoolExecutor 並行化提升效率
  • 爬蟲任務狀態常數集中管理
  • 資料連接器新增 ping / get_sub_league_names 等方法
  • ETL 執行頁篩選洲別功能

Cleanup

  • 移除冗餘頁面轉接層目錄(pages/、pages_backup/)
  • 移除重複測試目錄(tests/tests/)
  • 移除 pycache 編譯快取

v1.1.0 (2026-05-12)

Bug Fixes

  • 适配 titan007 URL 格式变更(s{id}_{instance}.js
  • score_ft 正则判断真实比分 VS 状态文字("推迟" / "取消")
  • ETL 快速配置传参修正(System A ID 过期时按名称重查)
  • 关注列表数据库 ID 过期自动修复
  • 元素重复错误(views/*.py 模块级 render() 调用)
  • Page not found 始终弹窗
  • 爬虫按关注赛季过滤,不再爬取全量历史
  • X 值计算跳过已完成比赛

Features

  • 单后台任务批量同步所有联赛赛季标签(≈14 秒完成 10,950 条)
  • WAF 拦截时使用缓存 fallback(seasons_cache.json
  • ETL 页一键快速配置分组 + 分配队伍
  • 仅导入系统 B(跳过爬虫,直接算 X 值 + 导入)
  • 完整同步流程防呆 + 进度 + 可跳过等待
  • 数据库管理页一键重置(清空 System A + B)
  • 全流程毛呢测试脚本
  • 赛季/比赛维度各自独立统计

Known Issues

  • X 值依赖于实时赔率数据,盘口无波动时 x=0(属正常)
  • titan007 WAF 可能间歇性拦截,使用缓存 fallback 缓解

许可证

MIT License


最后更新: 2026-05-24

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors