第 1 步:概述用例和约束
收集需求并确定问题的范围。提出问题以澄清用例和约束。讨论假设。
如果没有面试官来解决澄清问题,我们将定义一些用例和约束。
用例
我们将问题范围限定为仅处理以下用例
-
服务抓取 url 列表:
- 生成包含搜索词的页面的反向索引
- 为页面生成标题和片段
- 标题和片段是静态的,它们不会根据搜索查询而改变
-
用户输入搜索词并查看相关页面列表,其中包含爬虫生成的标题和片段
- 仅为此用例绘制高级组件和交互,无需深入
- 服务具有高可用性
超出范围
- 搜索分析
- 个性化搜索结果
- 页排名
约束和假设
状态假设
- 流量分布不均
- 有些搜索很受欢迎,而有些搜索只执行一次
- 仅支持匿名用户
- 生成搜索结果应该很快
- 络爬虫不应陷入无限循环
- 如果图包含一个循环,我们就会陷入无限循环
- 10 亿个要抓取的链接
- 页面需要定期爬取,保证新鲜度
- 平均刷新率约为每周一次,对于热门 站更频繁
- 每月抓取 40 亿个链接
- 每个 页的平均存储大小:500 KB
- 为简单起见,计数更改与新页面相同
- 每月 1000 亿次搜索
练习使用更传统的系统——不要使用现有的系统,例如solr或nutch。
计算用量
如果您应该进行粗略的使用计算,请与您的面试官澄清。
- 每月存储 2 PB 的页面内容
- 每页 500 KB * 每月抓取 40 亿个链接
- 3 年内存储 72 PB 的页面内容
- 每秒 1,600 个写入请求
- 每秒 40,000 个搜索请求
方便的转换指南:
- 每月 250 万秒
- 每秒 1 个请求 = 每月 250 万个请求
- 每秒 40 个请求 = 每月 1 亿个请求
- 每秒 400 个请求 = 每月 10 亿个请求
第 2 步:创建高级设计
概述包含所有重要组件的高级设计。
第三步:设计核心组件
深入了解每个核心组件的细节。
用例:服务抓取 url 列表
我们假设我们有一个最初基于整体 站受欢迎程度的排名的初始列表。如果这不是一个合理的假设,我们可以使用链接到外部内容(如Yahoo、DMOZ等)的流行 站为爬虫播种。
我们将使用一个表来存储处理后的链接及其页面签名。
我们可以将和存储在键值NoSQL 数据库中。对于 中的排名链接,我们可以使用带有排序集的Redis来维护页面链接的排名。我们应该讨论选择 SQL 或 NoSQL 之间的用例和权衡。
-
爬虫服务通过循环执行以下操作来处理每个页面链接:
- 抓取排名靠前的页面链接
- 在NoSQL 数据库中检查具有相似页面签名的条目
- 如果我们有相似的页面,降低页面链接的优先级
- 这可以防止我们进入一个循环
- 继续
- 否则,抓取链接
- 将作业添加到反向索引服务队列以生成反向索引
- 将作业添加到文档服务队列以生成静态标题和片段
- 生成页面签名
- 从NoSQL 数据库中删除链接
- 在NoSQL 数据库中插入页面链接和签名
- 如果我们有相似的页面,降低页面链接的优先级
- 在NoSQL 数据库中检查具有相似页面签名的条目
- 抓取排名靠前的页面链接
与你的面试官澄清你需要写多少代码。
是使用NoSQL 数据库的爬虫服务中的抽象:
是Crawler Service中的一个抽象,它封装了页面、其内容、子 url 和签名:
是Crawler Service中的主要类,由和组成。
处理重复项
我们需要小心 络爬虫不会陷入无限循环,当图形包含循环时会发生这种情况。
与你的面试官澄清你需要写多少代码。
我们要删除重复的 址:
- 对于较小的列表,我们可以使用类似
- 如果要抓取 10 亿个链接,我们可以使用MapReduce仅输出频率为 1 的条目
检测重复内容更加复杂。我们可以根据页面内容生成一个签名,并比较这两个签名的相似性。一些潜在的算法是Jaccard 索引和余弦相似度。
确定何时更新爬 结果
需要定期抓取页面以确保新鲜度。爬 结果可能有一个字段,指示上次爬 页面的时间。在默认时间段之后,比如一周,所有页面都应该被刷新。经常更新或更受欢迎的 站可以在更短的时间间隔内刷新。
虽然我们不会深入分析分析的细节,但我们可以进行一些数据挖掘来确定特定页面更新之前的平均时间,并使用该统计数据来确定重新抓取页面的频率。
我们也可以选择支持让 站管理员控制抓取频率的文件。
用例:用户输入一个搜索词并查看包含标题和片段的相关页面列表
- 客户端向Web 服务器发送请求,作为反向代理运行
- Web 服务器将请求转发到查询 API服务器
-
查询 API服务器执行以下操作 :
- 解析查询
- 删除标记
- 将文本分解为术语
- 修正错别字
- 规范大写
- 将查询转换为使用布尔运算
- 使用反向索引服务查找与查询匹配的文档
- 反向索引服务对匹配结果进行排名并返回排名靠前的结果
- 使用文档服务返回标题和片段
- 解析查询
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!