在爬虫系统中,在内存中维护着两个关于URL的队列,ToDo队列和Visited队列,ToDo队列存放的是爬虫从已经爬取的网页中解析出来的即将爬取的URL,但是网页是互联的,很可能解析出来的URL是已经爬取到的,因此需要VIsited队列来存放已经爬取过的URL。当爬虫从ToDo队列中取出一个URL的时候,先和Visited队列中的URL进行对比,确认此URL没有被爬取后就可以下载分析来。否则舍弃此URL,从Todo队列取出下一个URL继续工作。

然后,我们知道爬虫在爬取网页时,网页的量是比较大的,直接将所有的URL直接放入Visited队列是很浪费空间的。因此引入bloom filter!

(关于使用bloomfilter的原因:

visited队列中url过多,消耗内存空间是一方面。还有一个重要的原因,在从todo队列中取出一个新的URL时,必须和 visited中所有URL比较,确保没有处理过。那么如果直接比较的话,是要比较N(visited中所有url个数)次的,而且这个N相当大,效率明 显不够。采用bloom filter,最多只要比较K(我在文章中写的,相互独立的散列函数的个数)次,因为只要一个散列函数的散列值对应的位是0,就可以确定这个URL没有处 理过。

)

我们把bloom filer设置为m个bit,全部初始为0。

对每一个URL,进行K(K

经过上述处理的bloom filter实际上构成了我们所说的Visited队列,当我们从ToDo队列中取出一个新的URL时,同样,进行相同的K次哈希,每进行一次哈希,查看bloom filter中对应位,只要发现某位是0,就可以确定这个URL是没有处理过的,可以继续下载处理。

那么,原理清楚之后,还有几个问题没有解决。

1、bloom filter是有可能发生错误的,因为不处理碰撞,也就是说,有可能把不属于这个集合的元素误认为属于这个集合

错误率的计算:

在n个URL都进行k次散列加入之后,bloomfilter中某位是0的概率

错误率(即一个新的URL恰好k次散列的值对应的位都已经是1的概率)

2、哈希函数个数K的确定

k = ln2· (m/n)时(具体数学分析见http://blog.csdn.net/jiaomeng/article/details/1495500)

3、bloomfilter位数M的确定

我们可以想到,M的大小越大,错误率就会越小,但是数学证明给出了一个下界。即M = log2eN = 1.44N。

附上java代码

1 /**屈永泉 布隆过滤器 快速确定哪些网页已经被下载过*/

2

3 package crawler;4

5 import java.util.BitSet;6

7 public classBloomFilter {8 private int defaultSize = 5000 << 10000;9 private int basic = defaultSize - 1;10 private BitSet bits = newBitSet(defaultSize);11

12 private int[] lrandom(String key) { //产生八个随机数并返回

13 int[] randomsum = new int[8];14 for (int i = 0; i < 8; i++)15 randomsum[0] = hashCode(key, i + 1);16 returnrandomsum;17 }18

19 //将一个URL加入

20 public synchronized voidadd(String key) {21 int keyCode[] =lrandom(key);22 for (int i = 0; i < 8; i++)23 bits.set(keyCode[i]); //将指定索引处的位设置为 true

24 }25 }26

27 //判断一个URL是否存在

28 publicboolean exist(String key) {29 int keyCode[] =lrandom(key);30 if (bits.get(keyCode[0])31 && bits.get(keyCode[1]) //返回指定索引处的位值。

32 && bits.get(keyCode[2]) && bits.get(keyCode[3])33 && bits.get(keyCode[4]) && bits.get(keyCode[5])34 && bits.get(keyCode[6]) && bits.get(keyCode[7])) {35 return true;36 }37 return false;38 }39

40

41 private int hashCode(String key, intQ) {42 int h = 0;43 int off = 0;44 char val[] = key.toCharArray(); //将此URl转换为一个新的字符数组

45 int len =key.length();46 for (int i = 0; i < len; i++) {47 h = (30 + Q) * h + val[off++];48 }49 return basic &h;50 }51

52

53 /*public static void main(String[] args) { // TODO Auto-generated method54 long pre = 0;55 long post = 0;56 pre = System.nanoTime();57 BloomFilter f = new BloomFilter(); //初始化58 f.add("http://www.agrilink.cn/"); f.add("http://www.baidu.com/");59 System.out.println(f.exist("http://www.baidu.com/"));60 System.out.println(f.exist("http://www.baidud.com/"));61 post = System.nanoTime();62 System.out.println("Time: " + (post - pre));63

64 }65 */

66

67 }

View Code

java bloomfilter_爬虫技术之——bloom filter(含java代码)相关推荐

  1. Java网络爬虫--一步步使用Java网络爬虫技术实现豆瓣读书Top250数据的爬取,并插入数据库

    一步步使用Java网络爬虫技术实现豆瓣读书Top250数据的爬取,并插入数据库 目录 一步步使用Java网络爬虫技术实现豆瓣读书Top250数据的爬取,并插入数据库 第一步:创建项目,搭建项目结构 p ...

  2. java网络爬虫技术也可以代替Python实现网络新闻分析系统

    导读:自从大数据的概念被提出后,互联网数据成为了越来越多的科研单位进行数据挖掘的对象.网络新闻数据占据了互联网数据的半壁江山,相比传统媒体,其具有传播迅速.曝光时间短.含有网民舆论等相关特征,其蕴含的 ...

  3. java用爬虫爬一个页面_使用Java写一个简单爬虫爬取单页面

    使用Java爬虫爬取人民日报公众号页面图片 使用Java框架Jsoup和HttpClient实现,先看代码 爬取目标页面 1.使用Maven构建一个普通Java工程 加入依赖: org.jsoup j ...

  4. java 网络爬虫 正则表达式_【干货】Java网络爬虫基础知识

    原标题:[干货]Java网络爬虫基础知识 引言 Java 网络爬虫具有很好的扩展性可伸缩性,其是目前搜索引擎开发的重要组成部分.例如,著名的网络爬虫工具 Nutch 便是采用 Java 开发,该工具以 ...

  5. bloom filter 的Java 版

    属于转贴,原文地址: http://www.cnblogs.com/hitwtx/archive/2011/08/24/2152180.html 一. Bloom-Filter算法简介.        ...

  6. java网络爬虫0基础_简单的java爬虫程序(入门)

    首先做好准备工作: 了解正则表达式中基本的Select的用法: 此处引用楼主查到的资料 http://www.tuicool.com/articles/ZnyMvu 第一个爬虫:无验证码的简单爬虫 楼 ...

  7. JAVA毕设项目技术的游戏交易平台(java+VUE+Mybatis+Maven+Mysql)

    项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...

  8. java项目使用技术要求_想学JAVA 这些技术要求你必须知道,否则没戏

    在当今时代,随着电子产业的迅猛发展,Java技术也得到越来越广泛的应用,Java工程师随之也成为受欢迎的IT岗位,但是Java工程师到底是干什么的呢?安博亚威告诉你. Java工程师,直白点来说,就好 ...

  9. Java小项目--小型图书管理系统(含完整代码及工具)

    写在前面 对于一个java项目来说,我理解的整个流程是这样的: (1)进行需求分析 (2)设计数据库(重要) (3)编写java代码 注:数据库设计非常重要,特别是数据类型的定义,表与表之间的关系,如 ...

最新文章

  1. java trackid_Java Preference.getContext方法代码示例
  2. 使用异步 I/O 大大提高应用程序的性能
  3. 第3章 IP寻址
  4. 【动态规划】 摆花 【NOIp普及组 2012 第三题】 (ssl 2360/luogu 1077)
  5. 大牛出招|分分钟解决 MySQL 查询速度慢与性能差
  6. 批处理打开和关闭oracle11g 服务
  7. java sax解析复杂xml_SAX解析复杂的xml字符串
  8. Mail.Ru Cup 2018 Round 2: D. Refactoring(模拟+KMP)
  9. DB2sql关键字——ALTER TABLE ....ACTIVATE NOT LOGGED INITIALLY WITH EMPTY TABLE
  10. 【rmzt】阳光美女win7主题
  11. delphi java aes_Delphi AES加密(转)
  12. 单片机笔记(江科大自化协)
  13. ParticleEmitter旧粒子系统退役 2018新粒子系统
  14. Kubernetes 中的对象是如何删除的:Finalizers 字段介绍
  15. 浅谈策略交易、系统交易和程式交易
  16. MT7601U芯片怎么样?MT7601U处理器参数介绍
  17. graphql_GraphQL简介
  18. 连接校园网没有弹出登录界面或者连接手机热点上不了网
  19. 微信小程序picker多列选择器:mode = multiSelector
  20. 必考题系列--十种常见的运行时异常

热门文章

  1. uint32_t 是常数吗_UINT_MAX常数,带C ++示例
  2. 人工智能ai知识_人工智能中基于知识的代理层
  3. Java日历的getMinimalDaysInFirstWeek()方法和示例
  4. 面试必备:Spring 面试 63 问!
  5. Redis 过期策略与源码分析
  6. Redis 持久化——RDB
  7. 【slowfast复现 训练】训练过程 制作ava数据集 复现 SlowFast Networks for Video Recognition 训练 train
  8. mysql数据库关联练习_mysql数据库建立数据表的练习(附代码)
  9. 交换系统可以在计算机网络应用吗,数据通信交换技术在计算机网络中的应用
  10. html动态跟随鼠标效果,使用JS实现气泡跟随鼠标移动的动画效果