衡水市网站建设_网站建设公司_电商网站_seo优化
2026/1/17 18:34:59 网站建设 项目流程

一个可上线运行的“数据抓取 + Python Worker + Web 仪表盘”小系统(PHP + MySQL)

说明:本文主要分享工程实现方法,用于学习“定时抓取、入库、异步 Worker、可视化仪表盘、权限管理、运维守护”等技术点。文中展示的“预测/命中率”仅用于算法实验指标展示,不构成任何建议,也不保证准确性。请遵守法律法规与平台规则。


1. 这篇文章能学到什么

很多同学写过爬虫、写过页面、写过算法,但真正把它们拼成一个稳定可运行的系统,往往会遇到这些问题:

  • 数据抓到了,但落库失败(权限、环境变量、依赖缺失)
  • Worker 运行了,但页面看不到结果(表结构、字段不一致、心跳不更新)
  • 页面展示有了,但缺少自动刷新/倒计时/状态监控,体验不佳
  • 线上跑一晚就挂了(进程守护、日志、异常处理不完善)

本文会用一个完整项目的方式,把这些环节串起来。


2. 系统功能概览(工程视角)

2.1 数据抓取(Fetcher)

  • 定时从接口拉取最新记录
  • 同步落到两种存储:
    • CSV:便于备份、查看、临时恢复
    • MySQL:便于分页查询、统计、仪表盘展示
  • 使用INSERT ... ON DUPLICATE KEY UPDATE做 UPSERT,保证重复拉取也不会产生重复记录

2.2 异步 Worker(Predictor)

  • 周期性读取最新开奖
  • 生成下一期预测并写入predictions
  • 在开奖后对pending预测进行结算:写入hit_count/result_text/status
  • 写入worker_heartbeat心跳表:Web 能显示在线/离线、最近错误、最新处理期号
  • 支持补全 track 字段(例如track_0/track_+5/track_-1)方便调试与解释

2.3 Web 仪表盘(PHP)

  • 首页仪表盘:
    • 最新开奖(红色显示)
    • 下一期预测:开奖后若下一期还未生成,会显示“预测中”,避免误读上一期
    • 近 10 期命中率(动态颜色:红/黄/绿)
    • 最近记录(默认 20 条 + 翻页)
    • 倒计时到下一次开奖
    • 自动刷新
  • 历史页:分页 + 详情
  • 状态页:Worker 心跳与错误信息
  • 账号管理:管理员创建账号、限制次数/到期时间

3. 项目目录结构(建议理解方式)

以“职责分层”来理解:抓取层、计算层、展示层、基础设施。

  • history/lottery_data_fetcher.py
    • 抓取数据、写 CSV、写 MySQL
  • workers/prediction_worker.py
    • 预测 + 结算 + 心跳
  • php/
    • app/pages.php:页面控制器(查询 MySQL + render 视图)
    • app/views/*.php:页面视图(dashboard/history/status/admin)
    • app/helpers.php:通用函数(如hit_badge()
    • schema.sql:建表

4. 数据库表设计(核心)

4.1lottery_draws

  • period:期号(唯一)
  • open_number:开奖数字字符串
  • 其他可选字段:block/hash/local_time

4.2predictions

  • period:预测目标期号(唯一)
  • picks_json:预测号码 JSON
  • track0_json / track_minus1_json / track_plus5_json:轨迹字段(便于展示与调试)
  • statuspending/settled
  • hit_count/result_text:结算结果
  • debug_json:保存算法内部信息(投票、窗口、样本数等),适合做可解释性

4.3worker_heartbeat

  • last_tick_at:最后心跳
  • latest_draw_period:最新开奖期号(Worker 读到的)
  • latest_prediction_period:最新预测期号(Worker 写入的)
  • last_error:最近错误原因(页面可直接展示)

5. 环境与依赖

5.1 Python 依赖(Fetcher/Worker)

通常至少需要:

  • pymysql
  • requests
  • (按你的脚本而定)pytz

建议用pip安装(示例):

pipinstallpymysql requests pytz

5.2 PHP 环境

  • PHP 7.4+(建议 8.x)
  • PDO MySQL 扩展

6. 部署步骤(通用且稳)

下面写的是“思路与步骤”。实际线上部署请务必使用自己的数据库账号密码,不要把真实密码写进公开文章。

6.1 初始化数据库

执行php/schema.sql创建表:

-- 在 MySQL 客户端执行SOURCE/path/to/schema.sql;

或把内容复制到 SQL 面板运行。

6.2 配置数据库账号(建议单独账号)

建议创建单独用户并只授予必要权限:

CREATEUSER'yuche'@'127.0.0.1'IDENTIFIEDBY'替换成你自己的强密码';GRANTSELECT,INSERT,UPDATE,DELETEONyuche.*TO'yuche'@'127.0.0.1';FLUSHPRIVILEGES;

6.3 使用 Supervisor 守护 Python 进程

分别创建两个 program:

  • fetcher:抓取/入库
  • predictor:预测/结算

重点:environment 必须带上数据库配置,否则会出现“root 空密码 1045”等问题。

(示例仅作参考,按你的路径调整)

[program:yuchefatcher] command=python3 /www/wwwroot/xxx/history/lottery_data_fetcher.py directory=/www/wwwroot/xxx/history autostart=true autorestart=true stderr_logfile=/www/server/panel/plugin/supervisor/log/yuchefatcher.err.log stdout_logfile=/www/server/panel/plugin/supervisor/log/yuchefatcher.out.log environment=YU_MYSQL_ENABLE="1",YU_MYSQL_HOST="127.0.0.1",YU_MYSQL_PORT="3306",YU_MYSQL_DB="yuche",YU_MYSQL_USER="yuche",YU_MYSQL_PASS="你的密码" [program:predictor] command=python3 /www/wwwroot/xxx/workers/prediction_worker.py directory=/www/wwwroot/xxx/workers autostart=true autorestart=true stderr_logfile=/www/server/panel/plugin/supervisor/log/predictor.err.log stdout_logfile=/www/server/panel/plugin/supervisor/log/predictor.out.log environment=YU_MYSQL_HOST="127.0.0.1",YU_MYSQL_PORT="3306",YU_MYSQL_DB="yuche",YU_MYSQL_USER="yuche",YU_MYSQL_PASS="你的密码"

7. 线上排错指南(最实用的一节)

7.1 CSV 有数据,但 MySQL 没数据

常见原因:

  • MySQL 写入未开启(YU_MYSQL_ENABLE
  • environment 没生效(Supervisor 未重启)
  • 依赖缺失(pymysql未安装)
  • MySQL 权限不足(1045)

建议排查顺序:

  1. 先看*.err.log是否有异常栈
  2. 再看 fetcher 启动日志是否打印了正确的 DB host/db/user
  3. 最后直接查 MySQL:
SELECTCOUNT(*)FROMlottery_draws;

7.2 页面显示“no draws yet”

含义:predictor 去 MySQL 查询lottery_draws发现为空或连不上库。

解决:先保证 fetcher 写库成功,再启动 predictor。

7.3 track_0 / track_+5 显示为 –

含义:预测写入时没填充这些 JSON 字段。

解决:让 worker 在插入预测时同时写track0_json/track_plus5_json/track_minus1_json,并可做 backfill 补齐历史数据。


8. 前端体验增强(可选但加分)

8.1 命中显示统一为 badge

  • 命中:红色命中(xx)
  • 未命中:绿色未命中
  • 等待开奖:黄色等待开奖

这样不会再在表格里出现none这种难懂的字样。

8.2 自动刷新 + 倒计时

  • //status定时刷新
  • 倒计时到下一次开奖

8.3 声音提醒与中文播报(浏览器能力)

  • 倒计时最后 5 秒 beep 提醒
  • 开奖后用speechSynthesis中文播报

注意:部分浏览器需要用户先点击页面,才允许播放声音/播报(这是浏览器安全策略)。


9. 合规与安全建议(建议在公开文章里保留)

  • 不要在文章中放真实服务器 IP、真实账号密码
  • 不要承诺收益/准确率,也不要引导站外联系方式
  • 推荐强调“工程学习用途”:
    • 数据链路闭环
    • 异步 worker
    • 监控与可观测性
    • 权限与配额

10. 总结

这个项目本质上是一个“可上线运行的数据产品小模板”:

  • Python 把数据抓取与异步计算跑起来
  • MySQL 保证数据结构化与可查询
  • PHP 提供轻量管理台与可视化
  • Supervisor 保证进程稳定常驻

如果你正在练全栈/运维/数据工程,这类“小而完整”的项目非常适合。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询