架构设计

系统设计面试题 - 设计一个网页爬虫

2018-04-26  本文已影响56人  专职跑龙套

引用:
系统设计入门

设计一个网页爬虫

解答

第一步:通过讨论,明确限制及用例,确定Scope

支持的用例:

不支持的用例:

Constraints and assumptions:

计算规模:

第二步:高层次设计

设计一个网页爬虫

第三步:设计核心组件

假设我们有一个初始的网址列表 links_to_crawl,里面的网址是根据 popularity 排序的。可以使用Redis中的有序集合 sorted sets 来存储。

使用crawled_links存储已经处理过的网址及对应的网页签名 page signature。可以使用 key - value 的NoSQL数据库来存储。key 是网址,value 是网页签名。

Crawler Service 的主要工作:

处理重复:
防止抓取进入一个死循环。需要去除links_to_crawl中重复的网址。由于数据量很大,我们可以使用 MapReduce 来查询只出现了一次的网址。例如:

class RemoveDuplicateUrls(MRJob):
    def mapper(self, _, line):
        yield line, 1

    def reducer(self, key, values):
        total = sum(values)
        if total == 1:
            yield key, total

何时需要更新抓取结果:
使用timestamp记录每个网页上一次被抓取的时间。每隔一周需要重新抓取。
或者可以使用一些数据挖掘的方法,来估算每一个网页的更新时间。

搜索功能:提供一个Query REST API

返回的结果为JSON格式,例如:

{
    "title": "foo's title",
    "snippet": "foo's snippet",
    "link": "https://foo.com",
},
{
    "title": "bar's title",
    "snippet": "bar's snippet",
    "link": "https://bar.com",
}

第四步:扩展设计

设计一个网页爬虫
上一篇 下一篇

猜你喜欢

热点阅读