首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

UrlBloom Filter 算法、误差及其他

UrlBloom Filter 算法、误差及其他 fly with me , in the perfect world --- 题记 最近看了一些书,公式和算法,用一个词把他们窜起来的话...我这里说说误差和效率的一点关系。误差和效率是一对矛盾共同体,生活中有对误差和效率的关系描述:“萝卜快了,不洗泥”;“慢工出细活”等等,都精辟的说出了误差和效率的辨证关系。...误差换效率 google黑板报上一片文章,讲Url重用到的一个技巧:把平均长度较长的Url转换成平均长度较短的GUID来节省空间。...在Url方面还有一个常用的算法:Bloom Filter 算法。...weblogs.asp.net/dfindley/archive/2004/08/19/217485.aspx http://www.darkridge.com/~jpr5/archive/dads/HTML/bloomFilter.html

66930

基于Redis的Bloomfilter

Bloomfilter就是将去对象映射到几个内存“位”,通过几个位的0/1值来判断一个对象是否已经存在。...然而Bloomfilter运行在一台机器的内存上,不方便持久化(机器down掉就什么都没啦),也不方便分布式爬虫的统一去。...如果可以在Redis上申请内存进行Bloomfilter,以上两个问题就都能解决了。 本文即是用Python,基于Redis实现Bloomfilter。下面先放代码,最后附上说明。...总结 基于Redis的Bloomfilter,既用上了Bloomfilter的海量去能力,又用上了Redis的可持久化能力,基于Redis也方便分布式机器的去。...另外针对基于Scrapy+Redis框架的爬虫,我使用Bloomfilter作了一些优化,只需替换scrapy_redis模块即可使用Bloomfilter,并且去队列和种子队列可以拆分到不同的机器上

3K90
您找到你想要的搜索结果了吗?
是的
没有找到

使用bloomfilter修改scrapy-redis去

为什么要使用bloomfilter 首先我们先了解一下为什么要使用bloomfilter去修改scrapy的去机制。...(to_bytes(request.method)) fp.update(to_bytes(canonicalize_url(request.url))) fp.update(request.body...在这种情况下,我们要么通过增加内存来提高爬取上限,要么就改变去算法来减少内存占用。增加内存对于我们来说不太合适(qiong),那么就要改变去算法了。bloomfilter就是这样一个算法。...scrapy-redis修改去算法 我们先看一下scrapy-redis本身提供的去方式 def request_seen(self, request): """Returns True if...使用**kwargs参数是为了保持一致,在scheduler调度中保持参数的一致性,这样我们在settings中就可以切换配置两种去方式: settings: # 确保所有的爬虫通过Redis去 #

1.3K20

simhash文章

使用方:Google基于此算法实现网页文件查。   优点:相对传统文本相似性方法(欧氏距离、海明距离、余弦角度),解决计算量庞大等问题。   ...—其他简单方案:        百度大搜的去算法比较简单,就是直接找出此文章的最长的n句话,做一遍hash签名。n一般取3。       工程实现巨简单,据说准确率和召回率都能到达80%以上。   ...2、评估指标      准确率(97%): 数据集:重新闻集      方式:人工(研发先评估、产品评估)      召回率(75%):          数据集:训练数据集-重新闻集         ...参考资料 中文文档simhash值计算 网页文本的算法介绍 海量数据相似度计算之simhash和海明距离 短文本合并重复(去)的简单有效做法 海明距离查询方案 原文链接:https://www.cnblogs.com

1.4K30

位图:爬虫URL最佳方案

要处理的对象是网页链接URL,需支持: 添加一个URL和查询一个URL 还要求这两个操作执行效率尽可能高 处理上亿网页链接,内存消耗大,存储效率要尽可能高效。...为判 2 10亿网页链接存储在散列表,需多少内存? 假设一个URL平均64字节,10亿URL=60GB内存。因为散列表须维持较小装载因子,保证不出现过多冲突,导致操作性能下降。...也就是说,我们要让待判URL,跟链表中的每个URL,做字符串匹配。显然,这样一个字符串匹配操作,比起单纯的数字比对,要慢很多。所以,基于这两点,执行效率方面肯定是有优化空间的。...除了爬虫网页去这个例子,还有比如统计一个大型网站的每天的UV数,也就是每天有多少用户访问了网站,我们就可以使用布隆过滤器,对重复访问的用户,进行去。...如Java中的BitSet类就是一个位图,Redis也提供了BitMap位图类,Google的Guava工具包提供了BloomFilter布隆过滤器的实现。

1.3K20

Scrapy实战3:URL策略

一、前言 今天给大家分享的是,Python爬虫里url策略及实现。...二、url及策略简介 1.url     从字面上理解,url即去除重复的url,在爬虫中就是去除已经爬取过的url,避免重复爬取,既影响爬虫效率,又产生冗余数据。...2.url策略     从表面上看,url策略就是消除url重复的方法,常见的url策略有五种,如下: # 1.将访问过的ur保存到数据库中 # 2.将访问过的ur保存到set(集合)中,只需要...方法,将访问过的ur通过hash函数映射到某一位 # 5. bloomfilter方法对 bitmap进行改进,多重hash函数降低冲突 三、看代码,边学边敲边记url策略 1.将访问过的ur保存到数据库中...(字节), 计算式: 这样一比较,MD5的空间节省率为:(100-16)/100 = 84%(相比于方法二) (Scrapy框架url就是采用的类似方法) ''' # 维基百科看MD5算法 '''

1.8K30

爬虫课堂(十四)|URL的去方法

所谓的URL,就是爬虫将重复抓取的URL去除,避免多次抓取同一网页。...URL的去方法有很多种,从次到优依次可以分为以下5种: 1、将URL保存到数据库进行去(假设单个URL的平均长度是100 byte)。...4、使用Bitmap或Bloomfilter方法去URL经过hash后映射到bit的每一个位上,一亿URL占用约12M,问题是存在冲突)。...去方法介绍 一、将URL保存到数据库进行去 为了尽快把整个爬虫搭建起来,最开始的URL采用方案是直接利用数据库的唯一约束进行去,这是最省时的做法,所有人都能想得到和做到。...4、使用Bitmap方法去 使用Bitmap方法去的原理是把URL经过hash后映射到bit的每一个位上,一亿URL占用约12M,主要缺点是去没那么精准,存在冲突。

1.9K80

布隆过滤器,一文总结快速掌握,你能够get多少?

缺点 存在误差率。随着存入的元素数量增加,误算率随之增加。(比如现实中你是否遇到正常邮件也被放入垃圾邮件目录,正常短信被拦截)可以增加一个小的白名单,存储那些可能被误判的元素。 删除困难。...布隆过滤器作为一个插件加载到了Redis Server之中,给Redis提供了强大的布隆去功能。此文就不细讲了,大家感兴趣的可到官方查看详细文档介绍。...1% BloomFilter bloomFilter = BloomFilter.create(Funnels.integerFunnel(), size, 0.01)...五 扩展知识点 假如有一台服务器,内存只有4GB,磁盘上有2个大文件,文件A存储100亿个URL,文件B存储100亿个URL。请问如何模糊找出两个文件的URL交集?如何精致找出两个文件的URL交集。...模糊交集: 借助布隆过滤器思想,先将一个文件的URL通过hash函数映射到bit数组中,这样大大减少了内存存储,再读取另一个文件URL,去bit数组中进行匹配。

1.2K10

【渗透技巧】XSS三URL编码绕过实例

在黑盒渗透中,XSS在很多网站中普遍存在,这边分享一个简单有意思的XSS三URL编码绕过漏洞实例。 0x01 漏洞实例 某次测试中,遇到一个很奇葩的XSS,我们先来加一个双引号,看看输出: ?...如图,可以看到,双引号被转义了,这时候是不是有种想放弃的想法,抱着尝试的状态,我对双引号进行URL双重编码,再看一下输出: ?...我们再加一层URL编码,即三url编码,再看一下输出: ? URL编码被还原为双引号,闭合了前面的双引号,并带入到html中。我们可以轻易地构造Payload实现XSS。 ?...urldecode($b); //最后,url解码输出 ?...> 这边代码逻辑中,问题根源在于最后一句的url解码输出,导致存在XSS编码绕过的情况。根据实际情况,给出的安全建议:HTML ENCODE处理后直接输出变量。

3.3K10

如何让爬虫一天抓取100万张网页

对机器内存,硬盘空间,URL,网络性能,抓取间隙时间调优一般都不会在意。...优化内存,URL 再来说内存占用问题,做爬虫程序为了防止重复抓取URL,一般要把URL都加载进内存里,放在set()里面。...就还需要想办法压缩URL的内存占用,可以使用BloomFilter算法,是一个很经典的算法,非常适用海量数据的过滤,占用极少的内存,查询效率也非常的高。...BloomFilter调用也非常简单,当然需要先install 安装bloom_filter: from bloom_filter import BloomFilter# 生成一个装1亿大小的...从上图也能看到,基本抓到120次左右就会被屏蔽,每隔6秒拨号其实误差比较大,因为网络延迟等各种问题,导致6秒内可能抓100次,也可能抓120次。

1.6K20

使用BloomFilter布隆过滤器解决缓存击穿、垃圾邮件识别、集合判

譬如: 网页爬虫对URL的去,避免爬取相同的URL地址; 反垃圾邮件,从数十亿个垃圾邮件列表中判断某邮箱是否垃圾邮箱(同理,垃圾短信); 缓存击穿,将已存在的缓存放到布隆中,当黑客访问不存在的缓存时迅速返回避免缓存及...我们使用BloomFilter的目的就是想省空间,所以我们需要做的就是在错误率上做个权衡就OK。 很多时候这个错误率我们是能接受的,譬如垃圾邮箱问题,是坏人一定会被抓,这个能保证。...至于爬虫Url重复这个就更没问题了,会缺掉一些网页而已。...至于在缓存穿透上的应用,是为了避免恶意用户频繁请求缓存中不存在DB也不存在的值,会导致缓存失效、DB负载过大,可以使用BloomFilter把所有数据放到bit数组中,当用户请求时存在的值肯定能放行,部分不存在的值也会被放行...讲了这么多,可以看到,原理很简单,但要实际做一个BloomFilter可就麻烦了,已经属于科学家的范畴了,好在早早有人已经搞定了java版的实现,用法很简单,下一篇看看。

1.4K20

由散列表到BitMap的概念与应用(二)

BitMap对于每一个可能的整型值,通过直接寻址的方式进行映射,相当于使用了一个哈希函数,而布隆过滤器就是引入了k(k>1)个相互独立的哈希函数,保证在给定的空间、误判率下,完成元素判的过程。...那么布隆过滤器的误差有多少?我们假设所有哈希函数散列足够均匀,散列后落到Bitmap每个位置的概率均等。...当我们对某个元素进行判时,误判即这个元素对应的k个标志位不全为1,但所有k个标志位都被置为1,误判率ε约为: ? ? ? 场景 布隆过滤器的最大的用处就是,能够迅速判断一个元素是否在一个集合中。...因此他有如下三个使用场景: 网页爬虫对URL的去,避免爬取相同的URL地址 反垃圾邮件,从数十亿个垃圾邮件列表中判断某邮箱是否垃圾邮箱(同理,垃圾短信) 缓存击穿,将已存在的缓存放到布隆过滤器中,当黑客访问不存在的缓存时迅速返回避免缓存及...布隆过滤器就是引入了k(k>1)个相互独立的哈希函数,保证在给定的空间、误判率下,完成元素判的过程。布隆过滤器有一个误判率的概念,误判率越低,则数组越长,所占空间越大。

57530

使用Java实现布隆过滤器

布隆过滤器适合处理那些对一定的误判率可以接受的场景,例如网页爬取中的URL、缓存穿透问题的解决等。...布隆过滤器的应用场景网页爬取中的URL:在爬虫系统中,布隆过滤器可以帮助快速判断一个URL是否已经被抓取过,避免重复抓取。...数据去:对于海量数据的去操作,布隆过滤器可以减少实际判的开销,提高数据处理效率。...应用场景示例应用场景介绍布隆过滤器在实际应用中有很多场景,例如爬虫系统中的URL、缓存穿透问题的解决、拦截恶意请求等。...实际应用场景示例:URL去重在爬虫系统中,经常会遇到重复抓取同一个URL的情况,为了提高效率和节约资源,可以使用布隆过滤器来实现URL功能,减少重复抓取的次数。

15810

如何让爬虫一天抓取100万张网页

对机器内存,硬盘空间,URL,网络性能,抓取间隙时间调优一般都不会在意。...优化内存,URL 再来说内存占用问题,做爬虫程序为了防止重复抓取URL,一般要把URL都加载进内存里,放在set()里面。...就还需要想办法压缩URL的内存占用,可以使用BloomFilter算法,是一个很经典的算法,非常适用海量数据的过滤,占用极少的内存,查询效率也非常的高。...= BloomFilter(max_elements=100000000, error_rate=0.1) # 向bloom添加URL bloom.add('https://www.tianyancha.com...从上图也能看到,基本抓到120次左右就会被屏蔽,每隔6秒拨号其实误差比较大,因为网络延迟等各种问题,导致6秒内可能抓100次,也可能抓120次。

1.7K30

外行学 Python 爬虫 第四篇 URL

在 Python 中 URL可以通过以下几个方式来实现: 将 URL 保存在集合 (set) 中,使用集合的特性来去。 使用布隆过滤器来对 URL。...使用集合进行 url时,只需在每次需要爬取该 url 时判断该 url 是否在集合中,若不在获取网页信息并将该 url 放入集合中,若存在则跳过该 url 即可。...://list|item.szlcsc.+')): url = link.get('href') if url not in self.bloomfilter...__max_url_count: self.bloomfilter.add(url) self....在大多数场合我们使用集合来对 url已经足够使用了,以一个 url 平均长度 100 字节来算,一千万条 url 使用集合进行去所需要用到的内存空间不过也就是 1G,对现在的服务器或台式机来说应该不算太大的压力

82010

scrapy去与scrapy_redis去与布隆过滤器

在开始介绍scrapy的去之前,先想想我们是怎么对requests对去的。requests只是下载器,本身并没有提供去功能。所以我们需要自己去做。...很典型的做法是事先定义一个去队列,判断抓取的url是否在其中,如下: crawled_urls = set() def check_url(url): if url not in crawled_urls...scrapy的去 scrapy对request不做去很简单,只需要在request对象中设置dont_filter为True,如 yield scrapy.Request(url, callback...6 BLOOMFILTER_HASH_NUMBER = 6 # Redis Memory Bit of Bloomfilter Usage, 30 means 2^30 = 128MB, defaults...to 30 BLOOMFILTER_BIT = 30 # Persist SCHEDULER_PERSIST = True 其实也是修改了调度器与去方法,有兴趣的可以了解下。

2.3K20
领券