不重复抓取策略
? 不重復的關鍵在于爬蟲記住爬行的歷史.只有記住過去才可能不重復。爬蟲記錄歷史的方式是散列表(也稱為”雜湊表,’).每一條記錄是否被抓取的信息存放在散列表的某一個槽位上。如果某網頁在過去的某個時刻已經被抓取,則將其對應的槽位的值置I;反之置0,而具體映射到哪一個槽位,則由散列函數決定。
? ? I . MD5簽名函數
? ? 在介紹散列表前,首先簡單了解一下MD5簽名函數。MD5簽名是一個散列函數,可以將任意長度的數據流轉換為一個固定長度的數字(通常為4個整型數,即128位)。這個數字稱為.‘數據流的簽名”或者‘·指紋”.并且數據流中的任意一個微小的變化都會導致簽名值發生變化。
? ? 將URL字符串數字化是通過某種計算將任何一個URL字符串唯一地計算成一個整數。在一個URL散列函數映射下.任意一個字符串都唯一地對應一個整數。一個64位整數可以表達!.8X 10000000 TB (I TB= 1000 GB),而字符串空串3的大小遠遠大于64位整數所表達的整數空間大小,因此碰撞是不可避免的。所謂碰撞是指那些字符串不同.而計算出相同的簽名值的情況。然而如果散列函數設計得足夠好,則相互碰撞的機會可以小到忽略不計。
? ? 標準MD5簽名的整數空間很大.128位整數能表達2的128次方個不同的數.這是十分巨大的,而實際分配的散列表空間十分有限,一個普通32位處理器.理論上最多可以分配2的32次方大小的內存,即4G大小的內存。
? ? 因此,在實際處理中將簽名值進行模運算映射到實際的散列表中(可以理解為散列表存放在內存中)。因此實際的散列函數是MD5(URL%n%表示取模運算),這樣使得一個URL被映射到大小為n的散列表的某個槽位上。
轉載于:https://www.cnblogs.com/gaiwen/articles/2963420.html
總結
- 上一篇: WCF端口共享
- 下一篇: 数据仓库:Oracle Exadata和