CSDN博客

img Xiao_Qiang_

python实现bitmap原理

发表于2008/10/3 11:33:00  5393人阅读

分类: python



简单说明一下,这篇文章要说的bitmap不是大家google上检索出来的做图片的东东,而是对于爬虫而言,需要实现的一种不抓取重复页面的技术,大致说一下(具体可以去看相关的搜索引擎的书籍),一个url使用md5生成一个4个字节的md5码,然后存放入bitmap中,当然是要保证只存放一个,判断后面的找到的url是否已经存放在这个bitmap中了。

补充一下,http://www.imperialviolet.org/pybloom.html 里面说的bloom,pybloom(也是不抓取重复页面的技术),完全是一个垃圾,不信的话可以用一个整形1811395773试试,说是已经放在bloom中了,还有好多这种情况,这个比较让人受不了。


  1.  # -*- coding: utf-8 -*-
  2. import array
  3. '''''
  4. author: malaka
  5. mail:wengxiaojun1979@gmail.com
  6. city:ShangHai
  7. 目的是为了记录url地址,保证不重复抓取url地址;技术实现的概念主要是参考了梁斌的<<走进搜索引擎>>,使用python实现了bitmap
  8. '''
  9. class intBitmap:
  10.     '''''
  11.     说明:保存int大小(4 * 1byte = 4* 8 单位bit)的数据到bitmap中
  12.     len  :是指在每个array对象中要有多少个元素(最好是使用默认的值)
  13.     
  14.     '''
  15.     def __init__(self,len=8):
  16.         self.len = len
  17.         self.map = array.array ('L''/x00' * self.len * 4
  18.         
  19.   
  20.             
  21.     def __getitem__(self,id):
  22.         if id > self.len or id < 0 :
  23.             print 'error! id must >0 and <%i'%self.len
  24.         else : return self.map[id]
  25.         
  26.     
  27.     def insert(self,integerI):
  28.         index_Hash = integerI / 32 % self.len
  29.         index_int = integerI % 32
  30.         self.map[index_Hash] = (self.map[index_Hash] | (1<<index_int) )  
  31.    
  32.     def __contains__ (self, integerI,id=0):
  33.         index_Hash = integerI / 32 % self.len
  34.         index_int = integerI % 32
  35.         if(self.map[index_Hash] & (1<<index_int)):
  36.            return 1
  37.         else :
  38.            return 0   
  39.     
  40. class MD5BitMap():
  41.     '''''
  42.     说明:保存一个md5码到bitmap中 md5码大小(4 * 4byte = 4* 4 * 8 单位bit)的数据到bitmap中,也就是说128个bit
  43.     size :是指需要生成多少个array对象(最好是使用默认的值)
  44.     len  :是指在每个array对象中要有多少个元素(最好是使用默认的值)
  45.     
  46.     '''
  47.     def __init__(self, size=4,len=8):
  48.         self.size = size
  49.         self.len = len
  50.         self.collection = [] 
  51.         self.makeCollection() 
  52.         
  53.     def makeCollection(self):
  54.         for i in range(0,self.size):
  55.             self.collection.append(array.array ('L''/x00' * self.len * 4))  
  56.             
  57.             
  58.     def __getitem__(self,id):
  59.         if id > self.size or id < 0:
  60.             print 'error! id must >0 and <%i'%self.size
  61.         else : return self.collection[id]
  62.         
  63.     def getMd5(self,strURL):
  64.         import md5  
  65.         m1 = md5.new()   
  66.         m1.update(strURL)   
  67.         dest1 = m1.hexdigest()  
  68.         print (int(dest1[0:8],16),int(dest1[8:16],16),int(dest1[16:24],16),int(dest1[24:32],16))
  69.         return (int(dest1[0:8],16),int(dest1[8:16],16),int(dest1[16:24],16),int(dest1[24:32],16))
  70.         
  71.         
  72.     def insert(self,url):
  73.         splitUrls = self.getMd5(url)
  74.         for i in range(0,4):
  75.             index_Hash = splitUrls[i] / 32 % 8
  76.             index_int = splitUrls[i]  % 32
  77.             self.collection[i][index_Hash] = (self.collection[i][index_Hash] | (1<<index_int) )  
  78.         
  79.     def __contains__ (self, url):
  80.         splitUrls = self.getMd5(url)
  81.         for i in range(0,4):
  82.             index_Hash = splitUrls[i] / 32 % 8
  83.             index_int = splitUrls[i]  % 32
  84.             if not (self.collection[i][index_Hash] & (1<<index_int)):
  85.                 return 0
  86.         return 1    
  87. t = intBitmap()
  88. t.insert(1234)
  89. assert 1234 in t
  90. urlf = 'http://www.gbtai.com/radio369.htm'    
  91. test = MD5BitMap()
  92. test.insert(urlf)
  93. assert urlf in test

阅读全文
0 0

相关文章推荐

img
取 消
img