题目重点:设计可恢复网页抓取系统,区分URL去重、内容去重、调度公平性与网页变化。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 训练授权范围的公开网页抓取,明确seed、域名范围、robots/访问政策、最大深度与更新周期。登录内容与绕过访问限制不在此合同内。
- HTML获取与动态渲染成本不同,默认静态HTTP;URL规范化不能随意删除所有query参数,可能改变页面身份。
解题路线
- frontier记录canonicalURL、host、nextFetchAt、priority、state/lease。解析相对链接后标准化scheme/host/fragment,并按明确规则保留业务query;seenURL去重与内容hash重复是两层。
- 主机队列按nextAllowedAt调度与并发上限,全局worker领lease,不能靠一个全局FIFO让热门host吃满或违反礼貌抓取。失败backoff区分429/5xx/网络/永久404,遵守服务器给的retry策略。
- worker限制响应大小/超时/重定向次数,检查抓取目标范围与解析安全,提取links/content写持久对象。状态和发现的新URL通过可重放队列/outbox交付,ACK丢失允许重抓但去重结果。
- lease过期重新派发避免worker崩溃丢URL,generation防旧worker完成覆盖新任务。若发生大量同host重试,熔断/降速而非无界增worker。
- 重抓优先级结合变化率、重要性和上次结果,使用ETag/Last-Modified有条件请求。动态渲染只进入独立预算队列,不给每页启动浏览器拖垮整体吞吐。
- 监测fetch success、host delay、frontier age、duplicate ratio、bytes与parser failures;存内容版本支持变化分析,删除政策和robots变化影响后续调度。
手动走一遍
同页/a#x和/a#y可去fragment合并;/search?q=a和?q=b不能直接合并。worker抓完页面但ACK前崩溃,lease重派可能再下载,同URL/version结果幂等,发现links仍需确保不会因提前ACK而丢失。
规模与取舍
有效抓取吞吐上限还受各host允许速率之和,不由worker数单独决定。URL状态O(U)、内容存储按总bytes×保留版本;frontier去重Bloom可能误判漏抓,应明示是否允许漏率并保留权威集校验。
易错点与追问
容易失分的边界
- 把所有query删掉会合并不同内容,把session参数全保留又可能爬虫陷阱爆炸。
- 仅内存seen集重启失效,可能无限重复抓。
继续深挖
- 无限日历/参数组合怎样设置URL预算与trap detector?
- 变化很少的网站如何调低重抓频率而不永久遗漏更新?
