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