美文网首页
爬虫去重方案

爬虫去重方案

作者: cccshuang | 来源:发表于2018-01-24 15:53 被阅读0次

去重一般是对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开源库

相关文章

  • 爬虫去重方案

    去重一般是对URL去重,访问过的页面不在访问,但是也有例外,比如一些网站有用户评论,内容是不断变化的,若爬取评论,...

  • 爬虫去重策略

    1、将访问过的url保存到数据库中缺点:效率低2、将访问过的url保存到set中,只需要o(1)的代价就可以查询u...

  • 爬虫去重策略

    1.将访问过的url保存到数据库中,每次访问的时候通过数据库查询;效率低,使用少。2.将访问过的url保存到Set...

  • 爬虫去重策略

    数据库去重MySQL 有唯一字段可以去重(这不是数据库去重的唯一方法),但是这种太过依赖MySQL,会导致 MyS...

  • 爬虫去重策略

    1、将url保存到数据库中,检查时在数据库中查找。效率太低,频繁的切换内外存。使用mysql做去重,对url地址进...

  • scrapy了解一下?scrapy-redis和scrapy有什

    分布式爬虫 (๑• . •๑) 去重简单 爬虫中去重是一件大事,使用了scrapy-redis后就很简单了。上面提...

  • 网络爬虫去重策略

    在爬虫中,我们经常遇到这样的问题。一是希望抓取过的URL不再重复抓取,节省资源;二是希望下载过的数据不再重复下载(...

  • 45|位图:如何实现网页爬虫中的URL去重功能?

    45|位图:如何实现网页爬虫中的URL去重功能?

  • BloomFilter & Hyperloglog 去重 & 统

    去重小结 最近在做爬虫的时候,遇到了去重的问题,关于去重,有很多地方可以做,比如 内存级别,利用 hashmap,...

  • 大量数据去重方案

    数据库中有有一张表专门存储用户的维度数据,由于随着时间的推移,用户的维度数据也可能发生变化,故每一次查看都会保存一...

网友评论

      本文标题:爬虫去重方案

      本文链接:https://www.haomeiwen.com/subject/vfusaxtx.html