這個要看你想抓取的網頁數量是哪一種規模的。
若是是千萬如下用hash表, set, 布隆過濾器基本能夠解決,若是是海量的。。。。。。嗯我也沒作過海量的,不過hash表之類的就別想了,內存根本不夠,分割線下面是個人一個想法,歡迎你們討論。
布隆過濾器,大概幾十行代碼就能夠實現。能夠節省不少內存(我本身寫了一個沒有太多優化,佔用內存大概是hash存儲的1/4甚至更小)。
-------------------分割--------------------html
http://www.xxx.com/path/filename.html
------|---host----|---filename------|
在爬蟲中,會記錄下已爬過的URL,而後每次有新的URL會和這個集合比較,看看是否存在。在集合很大的時候,存儲這些URL會須要很大的存儲空間,並且比對時遍歷過去,須要必定時間。算法
針對這個問題,能夠採用布隆過濾器,左程雲在他的算法數據結構最優解一書中有講到,我這裏簡單描述一下。數據庫
選取一個m長的bit數組,數組每一位佔一個bit,即0或者1,再選擇k個哈希函數,每一個函數都能把url分散的映射到1~m的一個值上,將這個值對應到剛剛的數組裏面,把對應位置置爲1,每一個URL通過個hash映射,在比較理想狀況下,數組上會有k個位置設爲1。以後沒添加進來一個URL,到將其對應的k個位置設爲1,這樣隨着加進來的url數量增多,數組上會有愈來愈多的1,固然還會有0。數組
比對時,將新的URL映射一下,比對這映射的k個位置是否都爲1,不都爲1則表示這個url以前沒有遇到過,不然就是遇到過。網絡
看看scrapy 文檔的Duplicates filter這一章吧。數據結構
簡單的方法,就是哈希一下url,把哈希值存到一個set() 裏面,抓以前哈希url以後,去判斷一下set裏面有沒有有着url值。