题目重点:把URL发现、抓取和索引分开,保证去重与每主机礼貌调度。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 明确问爬虫系统,但未给目标站点、更新频率或规模。练习公开HTTP页面抓取和链接发现,不绕过登录或站点限制。
- 抓取遵循许可范围及站点规则;URL不同不必代表内容不同,规范化与内容去重要分层。
解题路线
- Frontier保存canonicalURL、priority、nextEligibleAt及attempt,按host分桶并带全局资源预算。发现链接先过滤scheme/范围、规范化,再原子去重入队,避免循环链接无限增长。
- worker领取带lease的任务,抓取后记录状态/内容hash/时间并提取链接;lease过期可能重复抓取,索引和内容写按URL/version幂等。不要假定队列可提供外部HTTP请求exactly-once。
- 每host限并发和间隔、按429/503退避,遵循明确重试预算。慢主机不占满整个pool,DNS/连接/读超时分别设置,总任务deadline限制挂起。
- 重抓频率依内容变化与业务价值,ETag/Last-Modified可减少传输但不保证所有站点支持。redirect链限深,抓取目标要重新验证范围,避免不合规则目标进入。
- 原页面对象存储,索引可异步重建;指标包括成功率、变化率、重复内容、host队列等待和带宽,不只数抓取量。
手动走一遍
A链接B、B链接A,去重Frontier避免无限循环。任务ACK丢失重抓同版本不会双建索引;某host返回429只延后其桶,不阻断其他host。内容hash相同可共享存储但保留各URL身份。
规模与取舍
设页面P、链接E和字节D,处理约O(P+E)元数据加解析/传输O(D);实际吞吐受host礼貌限制和网络。练习1000页面/s×100KB约100MB/s有效payload,峰值/副本/压缩另计。
易错点与追问
容易失分的边界
- 全局URL队列让单host占满并发。
- 只按URL去重就宣称内容无重复。
- 无redirect/链接范围检查和重试上限。
继续深挖
- 动态页面是否需要浏览器渲染,怎样限制资源成本?
- 如何避免URL日历/参数组合造成无限Frontier?
