爬虫的原理:首先收集一些种子页面,然后跟踪这些页面的链接来收集新的链接,如此循环。
爬虫用途:
- 搜索引擎索引(如googlebot)
- 网络档案(如图书馆档案)
- 网络挖掘(如金融公司爬虫获取股东会议和年度报告等)
- 网络监控(版权,商标侵权,盗版发现)
第一步 提问明确需求
本例中需求:
- 用于搜索引擎索引
- 每月1billion的页面
- 只考虑HTML
- 需考虑网页新增和更新
- HTML最长存储5年
- 需要忽略重复内容
可以考虑的特性:
- 可扩展性(Scalability:易于扩展规模)
- 稳健性(处理特殊case)
- 礼貌性(不能短时间向同一网站发送太多请求)
- 可扩展性(Extensibility:易于增加新功能)
估值:
- 假设每月下载1billion页面
- QPS:400/s
- Peak QPS: 400*2 = 800/2
- 假设每个页面大小500k
- 1billion * 500k = 500T每月
- 5年存储:500T * 12 * 5 = 30PB
第二步 high-level设计
第三步 深入讨论
- 算法:DFS vs BFS
- DFS深度太深,一般不适用于爬虫。
- 使用BFS考虑以下两个问题:
- 大量请求同时爬同一个网站,不友好
- 需要考虑不同网站优先级
- URL frontier
- 添加两组队列:
- 优先级管理:对URL进行优先级排序,并放入不同优先级的队列中
- Politeness管理:将特定host映射到同一个队列,并在worker维持一个delay
- 保持内容最新:全部重新爬虫费时费资源,可考虑一些策略来更新部分网站内容
- 存储:磁盘和内容混合存储,添加缓冲区等
- 添加两组队列:
- HTML下载器
- Robots Exclusion Protocol
- 性能优化
- 分布式
- 缓存DNS解析结果
- 考虑地理位置优化
- 设置超时时间
- 保持稳健性
- 通过一致性哈希扩展下载服务器
- 保存爬虫状态和数据,可在故障后重启
- 异常处理
- 数据验证
- 功能扩展
- 增加图片下载
- 增加监控模块
- …
- 问题内容检测
- 校验冗余
- Spider traps检验
- 噪音排除
第四步 总结
其它可讨论的点:
- 为支持动态生成的链接,在解析页面前可进行服务端渲染
- 垃圾过滤
- 水平扩展
- 可用性、一致性和可靠性
- 添加分析器