Day 078 — 爬虫部署与监控 · 练习清单
✅ 今日完成清单
- [ ] 理解 Scrapyd 的作用和基本架构
- [ ] 掌握 Docker Compose 编排多服务
- [ ] 理解结构化日志的设计原理
- [ ] 掌握批量写入优化数据库性能
- [ ] 理解布隆过滤器的工作原理
- [ ] 完成所有练习题
📝 基础练习题
练习 1:Scrapyd API 客户端
任务:扩展 01-scrapyd-client.py,添加以下功能:
1. get_version() — 获取 Scrapyd 版本信息
2. list_del_projects() — 列出所有可删除的项目
3. get_job_log(job_id) — 获取指定任务的日志内容
提示:查阅 Scrapyd API 文档 https://scrapyd.readthedocs.io/en/latest/api.html
练习 2:日志分析器
任务:编写一个日志分析脚本,读取结构化日志文件并输出: 1. 总请求数和成功率 2. 平均响应时间 3. 错误类型分布 Top 5 4. 每小时请求量趋势
# 输入:crawler.log(JSON 格式)
# 输出:统计报告
练习 3:批量写入优化
任务:修改 BatchWriter 类,支持以下特性:
1. 添加重试机制(写入失败时自动重试 3 次)
2. 支持不同的批量大小自适应(根据系统负载调整)
3. 添加写入性能统计(每秒写入量、平均批量大小)
🚀 进阶挑战题
挑战 1:分布式布隆过滤器
任务:设计一个支持多进程共享的布隆过滤器: 1. 使用 Redis 存储位数组 2. 支持多个爬虫进程同时使用 3. 实现原子性的添加和查询操作
提示:Redis 的 SETBIT 和 GETBIT 命令是原子操作
挑战 2:智能限速器
任务:实现一个智能限速中间件: 1. 根据目标网站的响应自动调整速度 2. 遇到 429/503 时自动降速 3. 连续成功后逐步提速 4. 支持每个域名独立限速
挑战 3:监控仪表盘
任务:使用 Flask + Chart.js 创建一个实时监控仪表盘: 1. 显示实时爬取速率(每秒请求数) 2. 显示成功率趋势图 3. 显示价格变动列表 4. 支持 WebSocket 实时更新
💡 思考题(无需写代码)
-
为什么布隆过滤器会有假阳性但不会有假阴性?从数学角度解释。
-
在什么场景下,批量写入可能反而降低性能?如何设计自适应的批量大小?
-
如果要爬取一个每天更新的商品网站,如何设计增量爬取策略?比较基于 ETag、Last-Modified、内容哈希三种方案。
📚 参考答案
完成练习后,可以参考以下资源验证: - Scrapyd 官方文档 - Docker Compose 文档 - Redis 命令参考 - Prometheus + Grafana 监控方案
📌 小贴士:不要急于完成所有题目,先把基础练习做完,有余力再挑战进阶题。理解原理比写出代码更重要!