10.5 If you were designing a web crawler, how would you avoid getting into infinite loops?
這道題問如果讓我們設計一個網路爬蟲,怎麼樣才能避免進入無限迴圈。那麼何謂無限迴圈呢,如果我們將網路看做一個圖Graph,無限迴圈就是當存在環Circle時可能發生的情況。當我們用BFS來進行搜尋時,每當我們訪問過一個網站,我們將其標記為已訪問過,下次再遇到直接跳過。那麼如何定義訪問過呢,是根據其內容還是根據其URL連結呢,根據URL連結更能會有多個連結指向同一個網站的情況,根據內容可能某個網站會有隨機生成內容的模組,所以一個比較好的解決方案是根據相似度來確定,即既包括內容又包括URL連結,下面我們來看具體如何實現:
1. 開啟網頁並根據特定的子模組和URL連結生成一個頁面簽名
2. 訪問資料庫看這個頁面簽名是否最近被訪問過
3. 如果最近被訪問過,將這個網頁新增到資料庫中低優先順序的位置
4. 如果沒有,則訪問此網站並將連線加入資料庫
如果是對於一個小型系統,比如區域網,我們可以對每個頁面設一個讓頁面接受訪問的最小優先順序。