1 场景
服务 抓取一系列链接
用户 输入搜索词后,可以看到相关的搜索结果列表,列表每一项都包含由网页爬虫生成的页面标题及摘要
目标:
网页爬虫不应该陷入死循环
抓取 10 亿个链接
流程图:
客户端向服务器发送一个请求
服务器 发送请求到 Query API 服务器
查询 API把查询结果返回给服务器
服务器把结果返回给客户端
2 服务
爬虫服务,查询服务,文档服务
使用倒排索引服务来查找匹配查询的文档
使用文档服务返回文章标题与摘要
爬虫服务按照流程,循环处理每一个页面链接
设计类,包括成员变量和成员函数
PagesDataStore 是爬虫服务中的一个抽象类,它使用 NoSQL 数据库进行存储。
Page 是爬虫服务的一个抽象类,它封装了网页对象,由页面链接、页面内容、子链接和页面签名构成。
设计函数
怎么抓取?
采用BFS的方法,维护一个队列,抓取到一个网页以后,分析网页的链接,扔到队列里。
优化:
采用优先队列调度,区别于单纯的BFS,对于每个网页设定一定的抓取权重,优先抓取权重较高的网页。对于权重的设定,考虑的因素有:1. 是否属于一个比较热门的网站 2. 链接长度 3. link到该网页的网页的权重 4. 该网页被指向的次数 等等。
进一步考虑,对于热门的网站,不能无限制的抓取,所以需要进行二级调度。首先调度抓取哪个网站,然后选中了要抓取的网站之后,调度在该网站中抓取哪些网页。这样做的好处是,非常礼貌的对单个网站的抓取有一定的限制,也给其他网站的网页抓取一些机会。
提高抓取效率?
多线程抓取
3 存储
我们应当在 选择 SQL 还是 NoSQL 的问题上,讨论有关使用场景以及利弊 。
4 扩展
1) 基准测试、负载测试。
2) 分析、描述性能瓶颈。
3) 在解决瓶颈问题的同时,评估替代方案、权衡利弊。
4) 重复以上步骤。