国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁 > 營銷資訊 > 網(wǎng)站運營 > 系統(tǒng)設(shè)計面試之網(wǎng)頁爬蟲

系統(tǒng)設(shè)計面試之網(wǎng)頁爬蟲

時間:2023-09-18 11:06:01 | 來源:網(wǎng)站運營

時間:2023-09-18 11:06:01 來源:網(wǎng)站運營

系統(tǒng)設(shè)計面試之網(wǎng)頁爬蟲:
本文翻譯自GitHub上有關(guān)系統(tǒng)設(shè)計的repo:system design primer里面關(guān)于面試系統(tǒng)設(shè)計之網(wǎng)頁爬蟲,6w+的star。
Note: 為了避免重復,當前文檔直接鏈接到系統(tǒng)設(shè)計主題的相關(guān)區(qū)域,請參考鏈接內(nèi)容以獲得綜合的討論點、權(quán)衡和替代方案。

第一步:概述用例和約束

收集這個問題的需求和范疇。 問相關(guān)問題來明確用例和約束。 討論一些假設(shè)。
因為沒有面試官來明確這些問題,所以我們自己將定義一些用例和約束。

用例

我們將問題的范疇限定在如下用例

超出范疇的用例

約束和假設(shè)

狀態(tài)假設(shè)

使用更傳統(tǒng)的系統(tǒng) - 不要使用 solr 或 nutch 等現(xiàn)有系統(tǒng)。

計算使用

如果您應該運行背信息使用計算,請與您的面試官澄清。

方便的轉(zhuǎn)換指南:

第二步:創(chuàng)建一個高層次設(shè)計

概述一個包括所有重要的組件的高層次設(shè)計

第三步:設(shè)計核心組件

深入每一個核心組件的細節(jié)

用例:服務爬取一個網(wǎng)址列表

假設(shè)我們有一個最初根據(jù)整體網(wǎng)站流行度排名的 links_to_crawl 列表。 如果這不是一個合理的假設(shè),我們可以使用鏈接到外部內(nèi)容(如 Yahoo,DMOZ 等)的熱門網(wǎng)站為爬蟲播種。

我們將使用表 crawled_links 來存儲已處理的鏈接及其頁面簽名。

我們可以將 links_to_crawlcrawled_links 存儲在鍵值 NoSQL Database 中。 對于 links_to_crawl 中的排名鏈接,我們可以使用 Redis 和排序集來維護頁面鏈接的排名。我們應該討論選擇 SQL 或 NoSQL 之間的用例和權(quán)衡。

向面試官闡明你需要寫多少代碼

PagesDataStore爬蟲服務中使用 NoSQL Database 的抽象:

class PagesDataStore(object): def __init__(self, db); self.db = db ... def add_link_to_crawl(self, url): """Add the given link to `links_to_crawl`.""" ... def remove_link_to_crawl(self, url): """Remove the given link from `links_to_crawl`.""" ... def reduce_priority_link_to_crawl(self, url): """Reduce the priority of a link in `links_to_crawl` to avoid cycles.""" ... def extract_max_priority_page(self): """Return the highest priority link in `links_to_crawl`.""" ... def insert_crawled_link(self, url, signature): """Add the given link to `crawled_links`.""" ... def crawled_similar(self, signature): """Determine if we've already crawled a page matching the given signature""" ...Page爬蟲服務中的一個抽象,它封裝了一個頁面,以及它的內(nèi)容,子URL和簽名:

class Page(object): def __init__(self, url, contents, child_urls, signature): self.url = url self.contents = contents self.child_urls = child_urls self.signature = signatureCrawler爬蟲服務中的主要類,由 PagePagesDataStore 組成。

class Crawler(object): def __init__(self, data_store, reverse_index_queue, doc_index_queue): self.data_store = data_store self.reverse_index_queue = reverse_index_queue self.doc_index_queue = doc_index_queue def create_signature(self, page): """Create signature based on url and contents.""" ... def crawl_page(self, page): for url in page.child_urls: self.data_store.add_link_to_crawl(url) page.signature = self.create_signature(page) self.data_store.remove_link_to_crawl(page.url) self.data_store.insert_crawled_link(page.url, page.signature) def crawl(self): while True: page = self.data_store.extract_max_priority_page() if page is None: break if self.data_store.crawled_similar(page.signature): self.data_store.reduce_priority_link_to_crawl(page.url) else: self.crawl_page(page)

處理重復

我們需要注意網(wǎng)絡爬蟲不會陷入無限循環(huán),這會在當圖形包含一個循環(huán)時發(fā)生。

向面試官闡明你需要寫多少代碼

我們要刪除重復的網(wǎng)址:

class RemoveDuplicateUrls(MRJob): def mapper(self, _, line): yield line, 1 def reducer(self, key, values): total = sum(values) if total == 1: yield key, total檢測重復內(nèi)容更復雜。 我們可以根據(jù)頁面內(nèi)容生成簽名,并比較這兩個簽名的相似性。 一些潛在的算法是 雅克卡指數(shù) 和余弦相似度。

確定何時更新爬取結(jié)果

需要定期爬取頁面以確保新鮮度。 爬取結(jié)果可能有一個 timestamp 字段,表示爬取頁面的最后時間。 在默認時間段(例如一周)之后,應刷新所有頁面。 經(jīng)常更新或更受歡迎的網(wǎng)站可以在較短的時間間隔內(nèi)刷新。

雖然我們不會深入研究分析的細節(jié),但我們可以進行一些數(shù)據(jù)挖掘以確定特定頁面更新之前的平均時間,并使用該統(tǒng)計信息來確定重新爬取頁面的頻率。

我們也可能選擇支持一個 Robots.txt 文件,該文件可讓網(wǎng)站管理員控制爬取頻率。

用例:用戶輸入搜索詞并查看帶有標題和摘要的相關(guān)頁面列表

我們將會用一個公開的 REST 風格接口:

$ curl https://search.com/api/v1/search?query=hello+worldResponse:

{ "title": "foo's title", "snippet": "foo's snippet", "link": "https://foo.com",},{ "title": "bar's title", "snippet": "bar's snippet", "link": "https://bar.com",},{ "title": "baz's title", "snippet": "baz's snippet", "link": "https://baz.com",},用于內(nèi)部通信,我們可以用 RPC。

第四步:擴展這個設(shè)計

基于給定的約束條件,確定并解決瓶頸問題。
重要提示: 不要簡單的從最初的設(shè)計直接跳到最終的設(shè)計

說明您將迭代地執(zhí)行這樣的操作:1)Benchmark/Load 測試,2)Profile 出瓶頸,3)在評估替代方案和權(quán)衡時解決瓶頸,4)重復前面,可以參考在 AWS 上設(shè)計一個可以支持百萬用戶的系統(tǒng)這個用來解決如何迭代地擴展初始設(shè)計的例子。

重要的是討論在初始設(shè)計中可能遇到的瓶頸,以及如何解決每個瓶頸。比如,在多個 Web 服務器上添加負載平衡器可以解決哪些問題?CDN 解決哪些問題?主從復制解決哪些問題? 替代方案是什么和怎么對每一個替代方案進行權(quán)衡比較?

我們將介紹一些組件來完成設(shè)計,并解決可伸縮性問題。內(nèi)部的負載平衡器并不能減少雜亂。

為了避免重復的討論, 參考以下系統(tǒng)設(shè)計主題獲取主要討論要點、權(quán)衡和替代方案:

有些搜索非常受歡迎,而其他搜索只執(zhí)行一次。 流行查詢可以從內(nèi)存緩存**(例如 Redis 或 Memcached)提供,以減少響應時間并避免重載反向索引服務文檔服務。內(nèi)存緩存對于處理不均勻分布的流量和流量峰值也很有用。 從內(nèi)存順序讀取 1 MB 大約需要 250 微秒,而從 SSD 讀取需要 4 倍,而從磁盤讀取需要 80 倍。1

以下是對爬取服務的一些其他優(yōu)化:

額外的話題

是否更深入探討額外主題,取決于問題的范圍和面試剩余的時間。

SQL 擴展模式

NoSQL

緩存

異步和微服務

通信

安全

參考安全。

延遲數(shù)字

見每個程序員都應該知道的延遲數(shù)。

持續(xù)進行

關(guān)鍵詞:爬蟲,設(shè)計,系統(tǒng)

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點擊下載Chrome瀏覽器
關(guān)閉