/**
* 如何不采集重复的网页?去重可以使用布隆过滤器,每个线程使用一个bitarray,
* 里面保存本批源页面上次抓取的页面的哈希值情况,抓取下来的源页面分析链接后,
* 去这个bitarray里判断以前有没有抓过这个页面,没有的话就抓下来,抓过的话就不管了。
* 假设一个源页面有30个链接,一批10W个源页面,300w个链接的bitarray应该也不会占太大内存。
* 所以有个五六个线程同时处理也是没问题的。
* **/
public class SimpleBloomFilter {
private static final int DEFAULT_SIZE = 2 << 24;
private static final int[] seeds = new int[] { 7, 11, 13, 31, 37, 61, };
private BitSet bits = new BitSet(DEFAULT_SIZE);
private SimpleHash[] func = new SimpleHash[seeds.length];
public SimpleBloomFilter() {
for (int i = 0; i < seeds.length; i++) {
func[i] = new SimpleHash(DEFAULT_SIZE, seeds[i]);
}
}
public static void main(String[] args) {
String value = "stone2083@yahoo.cn";
SimpleBloomFilter filter = new SimpleBloomFilter();
System.out.println(filter.contains(value));
filter.add(value);
System.out.println(filter.contains(value));
}
// 覆盖方法,把URL添加进来
public void add(CrawlUrl value) {
if (value != null)
add(value.getOriUrl());
}
// 覆盖方法,把URL添加进来
public void add(String value) {
for (SimpleHash f : func)
bits.set(f.hash(value), true);
}
// 覆盖方法,是否包含URL
public boolean contains(CrawlUrl value) {
return contains(value.getOriUrl());
}
// 覆盖方法,是否包含URL
public boolean contains(String value) {
if (value == null) {
return false;
}
boolean ret = true;
for (SimpleHash f : func) {
ret = ret && bits.get(f.hash(value));
}
return ret;
}
public static class SimpleHash {
private int cap;
private int seed;
public SimpleHash(int cap, int seed) {
this.cap = cap;
this.seed = seed;
}
public int hash(String value) {
int result = 0;
int len = value.length();
for (int i = 0; i < len; i++) {
result = seed * result + value.charAt(i);
}
return (cap - 1) & result;
}
}
}
分享到:
相关推荐
我们通过实现一个基于 Hadoop 的分布式网络爬虫工具,验证了改进型布隆过滤器算法在实际的分布式网络爬虫 URL 消重应用中的效果。实验结果表明,改进型布隆过滤器算法能够有效降低误判率,提高容忍能力,满足分布式...
这个Python库提供了对布隆过滤器的简单接口,使得开发者可以方便地在项目中应用布隆过滤器。安装过程非常直观,只需通过Python的setuptools工具执行`python setup.py install`命令即可将库安装到本地环境中。 布隆...
在实际应用中,Redis布隆过滤器常用于防止垃圾邮件、URL去重、推荐系统等领域,通过合理配置和使用,可以在保证效率的同时,有效降低资源消耗。不过,需要注意的是,由于其误判特性,不适用于那些对精确性要求极高的...
在数据量极大的互联网服务中,布隆过滤器被用于防止缓存穿透、数据库预加载、垃圾邮件过滤、Web爬虫的URL去重等。以推荐系统为例,布隆过滤器可以帮助我们快速判断用户是否已经接触过某个内容,避免向用户推送重复的...
在Java中,实现布隆过滤器可以使用开源库如Guava或者自定义实现。例如,`BloomFilter.java`和`MyBloomFilter.java`可能是两个不同的实现版本。自定义实现通常包括以下几个关键部分: 1. **位数组(Bit Array)**:...
布隆过滤器在实际应用中非常广泛,比如在大数据、缓存、反垃圾邮件系统、URL去重、数据库索引优化等领域都有所应用。使用Java实现的布隆过滤器库可以方便地集成到各种项目中,提高查询效率的同时降低资源消耗。 在...
为了解决URL去重问题,提高爬虫的检索效率,布隆过滤器(Bloom Filter)成为了一种理想的解决方案。布隆过滤器是一种概率型数据结构,它能够在有限的空间内高效地判断一个元素是否可能存在于某个集合中,虽然存在...
布隆过滤器作为一种高效的数据结构,被广泛应用于解决分布式爬虫中的URL去重问题,以提高爬取效率并减少资源浪费。 布隆过滤器的基本原理是通过多个独立的哈希函数将数据映射到一个固定大小的位数组中。每个哈希...
在实际应用中,需要根据具体需求选择合适的布隆过滤器变种,比如在数据库索引、垃圾邮件过滤、URL去重、推荐系统等领域都有其身影。 通过这个“bloom filter布隆过滤器学习资料大全”,你可以深入研究布隆过滤器的...
布隆过滤器在很多场景下都有应用,如网络爬虫用于避免爬取同一个URL多次,缓存系统判断数据是否在缓存中,以及数据库去重等。在这些应用场景中,布隆过滤器可以大幅度减少存储空间的需求,并且其检查操作仍然能保持...
本文将详细介绍基于Node.js的`nodebloom`库,这是一个实现布隆过滤器的服务,可用于构建高效的后端系统。 `nodebloom`是专门为Node.js和Express框架设计的一个模块,可以方便地集成到Web服务中,提供布隆过滤器的...
网页爬虫在抓取网页的过程中,为了避免重复抓取同一个网页,需要实现URL去重功能。最直观的方法是记录已爬取的URL,并在抓取新页面前检查该URL是否已经在记录列表中。对于大规模的URL处理,数据结构的选择至关重要,...
在实际应用中,布隆过滤器常被用于解决大数据集的去重问题,例如电话号码库的去重、新闻推送的去重、爬虫URL去重、NoSQL数据库的IO优化以及垃圾邮件过滤等场景。由于其节省空间的特性,布隆过滤器尤其适用于存储和...
在黑名单系统中,如邮件系统的垃圾邮件过滤或爬虫系统的URL去重,布隆过滤器同样有效。它通过使用多个独立的哈希函数,将元素映射到一个固定长度的位数组中。每个元素会根据这些哈希函数生成多个位置,然后在对应...
什么是『布隆过滤器』 布隆过滤器是一个神奇的数据结构,可以用来判断一个元素是否在一个集合中。很常用的一个功能是用来去重。在爬虫中常见的一个需求:目标网站 URL 千千万,怎么判断某个 URL 爬虫是否宠幸过?...
传统的哈希表在面对大量数据时可能会面临空间效率的问题,而布隆过滤器则提供了一种近似的去重方式。 布隆过滤器由一个很长的二进制数组和几个独立的哈希函数组成。当我们添加一个元素时,每个哈希函数都会将元素...
scrapy使用布隆过滤器实现增量爬取 之前看了很多关于scrapy-redis使用bloomfilter进行持久化存储进行url去重的例子,可是发现没有一种适用于scrapy,于是萌生了基于现有scrapy-redis-bloomfilter库进行改写的想法。 ...