一站式足球数据采集→量化分析→决策信号生成平台。爬取 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. 报表看板查信号 │
└──────────┘ └──────────────────────┘ └────────────────────┘
- 系统同步 — 点击「一键同步」创建全部联赛的赛季标签(≈14秒)
- 数据导入 — 添加关注联赛/赛季
- 完整同步 — 自动三步:赛程→赔率→X值计算(约几分钟,视数据量)
- ETL执行 — 先点「快速配置」建分组→执行ETL
- 报表看板 — 查看决策信号
| 功能 | 说明 |
|---|---|
| 🕷️ 联赛爬虫 | 从 titan007 抓取联赛列表、赛季赛程 |
| 📊 赔率爬虫 | 抓取每场比赛的盘口变动数据(AH/OU) |
| 🔄 数据标准化 | 队名简繁转换、盘口标准化 |
| 🎛️ 管理后台 | 配置管理、爬虫任务监控 |
| 🧹 智能跳过 | 已完成比赛自动跳过爬取 |
| 功能 | 说明 |
|---|---|
| 🏷️ 赛季标签管理 | 一次 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.shBug 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 編譯快取
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