zoukankan      html  css  js  c++  java
  • [爬虫学习笔记]基于Bloom Filter的url去重模块UrlSeen

            Url Seen用来做url去重。对于一个大的爬虫系统,它可能已经有百亿或者千亿的url,新来一个url如何能快速的判断url是否已经出现过非常关键。因为大的爬虫系统可能一秒钟就会下载几千个网页,一个网页一般能够抽取出几十个url,而每个url都需要执行去重操作,可想每秒需要执行大量的去重操作。因此Url Seen是整个爬虫系统中非常有技术含量的一个部分。

            为了提高过滤的效率,我们使用有极低误判率但是效率非常高的算法——Bloom Filter,已经有高手写好了Bloom Filter的算法实现,我们这里就直接站在巨人的肩膀上直接使用他写好的类库啦。

            Nuget:

    Install-Package BloomFilter

    代码实现:

    using System;
    using BloomFilterDotNet;
    
    namespace Crawler.Processing
    {
        /// <summary>
        /// Url Seen用来做url去重。对于一个大的爬虫系统,它可能已经有百亿或者千亿的url,新来一个url如何能快速的判断url是否已经出现过非常关键。因为大的爬虫系统可能一秒钟就会下载几千个网页,一个网页一般能够抽取出几十个url,而每个url都需要执行去重操作,可想每秒需要执行大量的去重操作。因此Url Seen是整个爬虫系统中非常有技术含量的一个部分。
        /// </summary>
        public class UrlSeen
        {
            private BloomFilter<string> Seen { set; get; }
            public UrlSeen()
            {
                Seen = new BloomFilter<string>(1000000, 0.0001, null);
            }
            public UrlSeen(int targetCapacity, double falsePositiveRate)
            {
                Seen = new BloomFilter<string>(targetCapacity, falsePositiveRate, null);
            }
            public bool MatchUrl(Uri url)
            {
                return Seen.Contains(url.ToString());
            }
            public int Count
            {
                get { return Seen.Count; }
            }
            public void Add(Uri url)
            {
                Seen.Add(url.ToString());
            }
        }
    }
  • 相关阅读:
    Java代理模式
    PHP7.3.0+弃用FILTER_FLAG_SCHEME_REQUIRED的解决办法
    《PHP7底层设计与源码实现》学习笔记1——PHP7的新特性和源码结构
    《MySQL实战45讲》学习笔记2——MySQL的日志系统
    PHP反射学习总结
    依赖注入模式中,为什么用对象而不是用数组传递?
    记MySQL的一次查询经历
    数据结构与算法之PHP递归函数
    PHP的json_encode()函数与JSON对象
    Linux系统如何查看版本信息
  • 原文地址:https://www.cnblogs.com/WayneShao/p/5910857.html
Copyright © 2011-2022 走看看