服务器部署脚本及定时启动
今天,搞定了一个有趣的项目——自动抓取B站视频在线人数排行榜并实时展示在网页上!从爬虫、部署网页,再到设置定时任务,每一步都踩了坑。点击这里访问B站视频实时在线人数排行榜
搭建前端页面
首先,得有个地方展示数据吧?
动态加载数据:
用JavaScript定时请求data.json
,让排行榜自动刷新。
💡 小贴士:
文件权限很重要!如果网页加载不出来,可能是Nginx/Apache没有读取权限,试试:
1
2chmod 644 index.html # 让Web服务器能读
chmod 755 static/ # 确保CSS/JS能加载
爬虫脚本
Python爬虫登场!目标是每小时自动抓取B站视频在线人数,存进data.json
。
关键技术:
requests
发HTTP请求(记得加headers模拟浏览器,不然会被B站反爬)json
模块处理数据,避免手写字符串(容易出错!)异常处理!网络可能抽风,脚本不能崩:
1
2
3
4try:
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
2chmod 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 | [Unit] |
创建定时器:
1 | sudo nano /etc/systemd/system/bili_crawler.timer |
1 | [Unit] |
启动:
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 | /var/log/bili_cron.log { |
2. 资源监控
看Python脚本占多少内存/CPU:
1 | top -p $(pgrep -f your_script.py) |
如果脚本跑太久,可能被系统杀掉,可以加个超时控制:
1 | import signal |
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搞个酷炫的实时数据看板!