网络爬虫去重策略

在爬虫中,我们经常遇到这样的问题。一是希望抓取过的URL不再重复抓取,节省资源;二是希望下载过的数据不再重复下载(一般情况下保证了第一条可以差不多满足第二条)。

爬虫去重一般是对URL去重,访问过的页面不在访问去重可以避免网络之间的环路,并且增加爬取效率。


今天我们介绍几个去重策略

一、像十万以下URL的抓取可以简单的用set来实现去重,可以在O(1)的时间内查询到一个URL是否存在于set中。

缺点:占用内存大,比如有1亿条URL,占用的内存是:1000000000*2byte*50字符/1024/1024/1024 = 9G(假设字符使用的是unicode编码,每一个字符占2字节,每一个URL有50个字符)。

二、如果是百万或者千万量级的话,考虑到性能,我们应该使用基于hash的set实现去重。哈希使得我们并不需要对比超长的URL以及params,只需要对比其哈希值。

缺点:如果检测结果为是,该元素不一定在集合中;但如果检测结果为否,该元素一定不在集合中。这样每个检测请求返回有“在集合内(可能错误)”和“不在集合内(绝对不在集合内)”两种情况,可见 Bloom filter 是牺牲了正确率和时间以节省空间。

三、URL经过MD5或SHA-1等哈希算法生成摘要,再存到HashSet中。MD5处理后摘要长度128位,SHA-1摘要长度160位,这样占用内存比直接存小很多。(scrapy使用的就是类似的方法)

四、使用bitmap方法,将访问过的URL通过hash函数映射到某一位上,这种方法可以大大压缩URL的存储空间,但是缺点是,会有很多的映射冲突,即多个不同的URL映射到一个位上。

五、如果数据量上亿或者几十亿时使用 Bloom Filter(中文:布隆过滤器)算法。布隆过滤器原理是这样的,一个URL过来,通过M个特别的哈希函数对其进行运算,映射成一个M维位数组的M个维度。新的URL诞生时,进行同样操作并逐个与set中的位数组做“与”运算,若结果改变则说明URL一定没有被抓取过,若结果一致则说明URL有一定概率被抓取过因为有一定的低错误率。布隆过滤器的插入和查询效率都是O(M),远低于其他一般策略。使用Bloom Filter方法对bitmap进行改进,多重哈希函数降低冲突,是对(四:bitmap方法)的改进,既能降低冲突,又能大大压缩内存

六、像MySQL这种关系型数据库,我们可以设置主键或者唯一索引来保证数据的唯一性。查询导致效率低,不推荐。

七、像MongoDB这种Schema free的非关系型数据库,我们可以用先检索再插入或者是upsert的方式保证数据的唯一性。(相对于MySQL数据库的性能有了很大的提升)

八、缓存数据库去重: 如Redis数据库其高速的读写,使用其中的Set数据类型,并可将内存中的数据持久化,应用广泛,推荐。


比较好的方式为:URL经过MD5或SHA-1等哈希算法生成摘要,再存到 Redis的HashSet中

欢迎留言纠错补充,QQ:2223136131

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,398评论 25 707
  • 二十多岁不再是耳听爱情的年纪。但我,对外宣称是要一心学习,祖国尚未统一,岂敢儿女情长;一般人配不上我,因为我太过优...
    Cora狂奔的土豆泥阅读 286评论 5 2
  • 今天那是真凉快!都冷! 就昨晚一场小雨而已,满世界透着清凉。 院子里的花草也洗干净了,在练字群里还看到厦门的小伙伴...
    只一点阅读 115评论 0 0
  • 浮躁的表现:心绪难平,容易不耐烦,做事坚持不下去或者勉强坚持收效甚微,想选择什么都不干或者猎奇。 浮躁的原因:一般...
    枫林小筑阅读 624评论 0 0