← 返回 Day 78 正文

Day 78 · 练习与清单

Day 078 — 爬虫部署与监控 · 练习清单

✅ 今日完成清单


📝 基础练习题

练习 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. 每小时请求量趋势

python
# 输入: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 实时更新


💡 思考题(无需写代码)

  1. 为什么布隆过滤器会有假阳性但不会有假阴性?从数学角度解释。

  2. 在什么场景下,批量写入可能反而降低性能?如何设计自适应的批量大小?

  3. 如果要爬取一个每天更新的商品网站,如何设计增量爬取策略?比较基于 ETag、Last-Modified、内容哈希三种方案。


📚 参考答案

完成练习后,可以参考以下资源验证: - Scrapyd 官方文档 - Docker Compose 文档 - Redis 命令参考 - Prometheus + Grafana 监控方案


📌 小贴士:不要急于完成所有题目,先把基础练习做完,有余力再挑战进阶题。理解原理比写出代码更重要!