基于set和单例去重

基于set和单例去重
去重”是日常工作中会经常用到的一项技能,在爬虫领域更是常用,并且规模一般都比较大。去重需要考虑两个点:去重的数据量、去重速度。为了保持较快的去重速度,一般选择在内存中进行去重。
1、数据量不大时,可以直接放在内存里面进行去重,例如python可以使用set()进行去重。
2、当数据量再大一点时,可以用不同的加密算法先将长字符串压缩成 16/32/40 个字符,再使用上面两种方法去重;
3、代码中使用了MD5加密压缩,将字符串压缩到了32个字符(也可用hashlib.sha1()压缩成40个字符)。因为对一个很长的字符串哈希映射的时候会出错,经常误判为已存在,压缩后就不再有这个问题;

from hashlib import md5

class Singleton(type):
    """
    元类 实现单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,
    某个类只能出现一个实例时,单例对象就能派上用场。

    """
    _instances = {}

    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)

        return cls._instances[cls]



class DelDuplicatel(metaclass=Singleton):
    """
    地址去重
    """
    def __init__(self):
        self.fingerprints = set()


    def Is_exist(self, str_input):
        if not str_input:
            return False
        m5 = md5()
        # s1.update(upwd.encode("utf8"))  # 指定编码格式,否则会报错
        m5.update(str_input.encode("utf8"))
        str_input = m5.hexdigest()
        if str_input in self.fingerprints:
            return True
        else:
            self.fingerprints.add(str_input)
            return False

    def __str__(self):
        return str(self.fingerprints)




if __name__ == '__main__':
   dup= DelDuplicatel()
   dup.Is_exist("http://qurl.f.360.cn/wdinfo.php")
   dup.Is_exist("http://se.360.cn/cc/vcss_55.dat")
   dup.Is_exist("https://eclick.baidu.com/a.js?tu=u3491668&op=1&jk=e57838b56938f7b5&word=https%3A%2F%2Fblog.csdn.net%2Floner_fang%2Farticle%2Fdetails%2F81097050&if=0&aw=852&ah=60&pt=2401000&it=4000&vt=4000&csp=1536,824&bcl=1519,722&pof=1519,10463&top=4918&left=487&uid=u3491668_0&iw=false&total=3&rdm=1557063648549")
   print(dup.Is_exist("http://se.360.cn/cc/vcss_55.dat"))
   print(dup)
   dup2=DelDuplicatel()
   dup2.Is_exist("http://se.360.cn/cc/vcss_55.dat")
   print(dup2)
   dup2.Is_exist("http://info.pinyin.sogou.com/ime_push/getPopupIni.php?h=E103855AFF6109DE75387983D4B6CFBE&v=8.3.0.9412&r=0000__8.3a&passport=&activeOp=0&action_skin=1&action_dict=1&action_normal=1&action_gram=1&skinOp=c18021i18021&updateOp=785&dictOp=c2i18021&DisabledEntries=0&disable_newword=0&uex=0&defaultime=1&fvo=6.2.17134&pvo=10.0.17134&sgse=0&ppversion=3.1.0.2061&active_skin=&active_skin_id=&active_skin_md5=&active_skin_isflash=0&urlguide=120&type=query&Popup_DisableSkinBubble=0&pushids=&hpushids=&hpopids=&popids=&condids=&sgse_r=&snni=1&sndd=0&snlt=221107")
   print(dup2)

执行的结果如下:

True
{'59ca7b7c0f23a714204928f7eef11942', '7c5705c8668a967820b9b45ce22fd278', '6162d724d55f5298d1ceef0369de6857'}
{'59ca7b7c0f23a714204928f7eef11942', '7c5705c8668a967820b9b45ce22fd278', '6162d724d55f5298d1ceef0369de6857'}
{'59ca7b7c0f23a714204928f7eef11942', '7c5705c8668a967820b9b45ce22fd278', '5d75e1290c2c036ddc2941b181d3341a', '6162d724d55f5298d1ceef0369de6857'}

猜你喜欢

转载自blog.csdn.net/huangwencai123/article/details/89856644