不重复抓取策略

  不重复的关键在于爬虫记住爬行的历史.只有记住过去才可能不重复。爬虫记录历史的方式是散列表(也称为”杂凑表,’).每一条记录是否被抓取的信息存放在散列表的某一个槽位上。如果某网页在过去的某个时刻已经被抓取,则将其对应的槽位的值置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的散列表的某个槽位上。

posted @ 2013-03-16 15:37  盖文  阅读(277)  评论(0编辑  收藏  举报