服务器部署脚本及定时启动

今天,搞定了一个有趣的项目——自动抓取B站视频在线人数排行榜并实时展示在网页上!从爬虫、部署网页,再到设置定时任务,每一步都踩了坑。点击这里访问B站视频实时在线人数排行榜

搭建前端页面

首先,得有个地方展示数据吧?

动态加载数据:

用JavaScript定时请求data.json,让排行榜自动刷新。

💡 小贴士:

  • 文件权限很重要!如果网页加载不出来,可能是Nginx/Apache没有读取权限,试试:

    1
    2
    chmod 644 index.html  # 让Web服务器能读
    chmod 755 static/ # 确保CSS/JS能加载

爬虫脚本

Python爬虫登场!目标是每小时自动抓取B站视频在线人数,存进data.json

关键技术:

  • requests 发HTTP请求(记得加headers模拟浏览器,不然会被B站反爬)

  • json 模块处理数据,避免手写字符串(容易出错!)

  • 异常处理!网络可能抽风,脚本不能崩:

    1
    2
    3
    4
    try:
    response = requests.get(url, headers=headers, timeout=5)
    except Exception as e:
    print(f"Error: {e}")

💡 小贴士:

  • 别太频繁请求,否则可能被封IP!可以加个time.sleep(2)控制节奏。
  • 遵守robots.txt,看看B站允不允许爬(虽然大部分API接口没限制)。

服务器部署——让脚本自己跑起来!

爬虫写好了,但不能每次都手动运行吧?定时任务才是王道!

方法1:Linux crontab(经典永流传)

编辑定时任务:

1
crontab -e  # 编辑定时任务

添加一行,让它每小时跑一次:

1
0 * * * * /usr/bin/python3 /path/to/your_script.py >> /var/log/bili_cron.log 2>&1

>> /var/log/bili_cron.log:把输出存到日志文件,方便查错。

2>&1:连错误信息也一起记录。

💡 小贴士:

  • 权限问题:如果脚本无法写入data.json,试试:

    1
    2
    chmod 664 data.json  # 让Python脚本能修改
    chown www-data:www-data data.json # 如果是Web服务器用户(如Nginx)

测试cron是否生效:

1
tail -f /var/log/syslog | grep CRON  # 看cron有没有真的执行

方法2:Systemd Timer(更现代的选择)

如果觉得cron太老派,可以用systemd:

创建服务文件:

1
sudo nano /etc/systemd/system/bili_crawler.service
1
2
3
4
5
6
[Unit]
Description=B站数据爬取服务

[Service]
ExecStart=/usr/bin/python3 /path/to/your_script.py
User=www-data # 用Web服务器用户运行

创建定时器:

1
sudo nano /etc/systemd/system/bili_crawler.timer
1
2
3
4
5
6
7
8
9
[Unit]
Description=每小时跑一次B站爬虫

[Timer]
OnCalendar=hourly # 每小时一次
Persistent=true # 如果服务器关机,下次启动会补跑

[Install]
WantedBy=timers.target

启动:

1
sudo systemctl enable --now bili_crawler.timer

💡 小贴士:

  • systemd比cron更强大,可以精确控制任务依赖、失败重启等。

查看日志:

1
journalctl -u bili_crawler.service  # 看最近执行情况

监控与维护——别让脚本偷偷挂了!

自动化是爽,但如果脚本突然不工作了怎么办?

1. 日志检查

如果用了cron,记得定期看日志:

1
tail -f /var/log/bili_cron.log  # 实时监控

如果日志太大,可以用logrotate自动切割:

1
sudo nano /etc/logrotate.d/bili_cron
1
2
3
4
5
6
7
/var/log/bili_cron.log {
daily
rotate 7
missingok
notifempty
compress
}

2. 资源监控

看Python脚本占多少内存/CPU:

1
top -p $(pgrep -f your_script.py)

如果脚本跑太久,可能被系统杀掉,可以加个超时控制:

1
2
import signal
signal.alarm(60) # 60秒后超时

3. 异常报警

最简单的方法:用mail命令发邮件(前提服务器配好了SMTP):

1
echo "脚本挂了!快检查!" | mail -s "B站爬虫报警" your@email.com

进阶玩法:接入Prometheus + Grafana,或者直接用第三方监控(如UptimeRobot)。

优化与扩展

优化方向:

  • ✅ 缓存机制:如果B站API有频率限制,可以加个cache.json,避免重复请求。

  • ✅ 多线程/异步:用aiohttp替代requests,让爬虫跑得更快!

  • ✅ 数据备份:每天自动备份data.json,避免意外丢失:

    1
    cp data.json data_$(date +%Y%m%d).json

扩展玩法:

  • 🚀 接入数据库:SQLite(轻量)、MySQL(稳定)、MongoDB(灵活)任选。
  • 🚀 API接口:用Flask/FastAPI暴露数据,让其他程序也能调用。
  • 🚀 可视化大屏:用Echarts搞个酷炫的实时数据看板!