爬虫去重方案

去重一般是对URL去重,访问过的页面不在访问,但是也有例外,比如一些网站有用户评论,内容是不断变化的,若爬取评论,则就不能以URL作为去重标准,但本质上都可以看做针对字符串的去重。
去重可以避免网络之间的环路,并且增加爬取效率。常见有以下几种方式:

  • 关系数据库去重:查询导致效率低,不推荐。
  • 缓存数据库去重: 如Redis,使用其中的Set数据类型,并可将内存中的数据持久化,应用广泛,推荐。
  • 内存去重:最大制约是内存大小和掉电易失。
    1. URL直接存到HashSet中:太消耗内存。
    2. URL经过MD5或SHA-1等哈希算法生成摘要,再存到HashSet中。MD5处理后摘要长度128位,SHA-1摘要长度160位,这样占用内存比直接存小很多。
    3. 采用Bit-Map方法,建立一个BitSet,每个URL经过一个哈希函数映射到一位,消耗内存最少,但是发生冲突概率太高,易误判。

综上,比较好的方式为:内存去重第二种方式+缓存数据库。基本可以满足大多数中型爬虫需要。数据量上亿或者几十亿时,就需要用BloomFilter算法了。

BloomFilter算法

  1. 创建一个m位的位数组,所有位初始化为0。
  2. 选择k个不同的哈希函数,记第i个哈希函数对字符串str哈希的结果为h(i,str),h(i,str)范围是0到m-1。
  3. 字符串经过哈希函数映射为k个介于0到m-1的数字,将m位数组中下标为这k个数的位置1。这样便将字符串映射到位数组中的k个二进制位了。
  4. 若判断字符串是否存在,只需将新的字符串进行哈希,检查每一个映射对应的m位位数组的值是否为1,若任何1位不为1,则一定没被记录过。若一个字符串对应的任何一位全为1,但不能说明这个字符串肯定被记录过,因为有一定的低错误率。因此布隆过滤器适用于能容忍低错误率的场合。
    python-bloomfilter开源库
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,494评论 11 349
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,058评论 19 139
  • 近日有幸和我们的美术老师一起聊天!聊到了现在的孩子们真的很不容易!各种兴趣班、辅导班、活动等等!那么,为什...
    课程顾问沈辉阅读 3,813评论 0 0
  • 薄雨初寒香桂陨, 秋风撩窗扰梦人。 梓里妻儿待某归, 立业星城共闲生。
    timooabc阅读 2,924评论 0 0
  • 使用Vue了一段时间,感觉确实不错,“数据驱动视图”非常好用,大部分情况下都不需要关心dom,但是凡事都有例外,总...
    冰麟轻武阅读 12,274评论 6 2

友情链接更多精彩内容