这个要看你想抓取的网页数量是哪种规模的。
如果是千万以下用hash表, set, 布隆过滤器基本可以解决,如果是海量的。。。。。。嗯我也没做过海量的,不过hash表之类的就别想了,内存根本不够,分割线下面是我的一个想法,欢迎大家讨论。
布隆过滤器,大概几十行代码就可以实现。可以节省很多内存(我自己写了一个没有太多优化,占用内存大概是hash存储的1/4甚至更小)。
-------------------分割--------------------

http://www.xxx.com/path/filename.html
------|---host----|---filename------|

假设网络上有一亿个page,对应了一亿个url, 由于资源限制我不能直接存储所有的url,甚至hash之后存储都存不下,但是我可以发现,网络上总共只有1万个网站,平均每个网站有1万个page,换个方式。我只要维护两个hash表,一个用来记录我所有抓取过的host,一个用来记录正在抓取的网站的filename,这样只要两个hash表就可以对1亿个url去重了。然后你需要一个数据库,抓取到一个网页之后判断里面的链接,指向当前网站就继续抓,否则,这条url存到数据库里面,当前网站抓取结束,继续处理下一个网站。。。。

 
 

在爬虫中,会记录下已爬过的URL,然后每次有新的URL会和这个集合比较,看看是否存在。在集合很大的时候,存储这些URL会需要很大的存储空间,而且比对时遍历过去,需要一定时间。

针对这个问题,可以采用布隆过滤器,左程云在他的算法数据结构最优解一书中有讲到,我这里简单描述一下。

选取一个m长的bit数组,数组每一位占一个bit,即0或者1,再选择k个哈希函数,每个函数都能把url分散的映射到1~m的一个值上,将这个值对应到刚刚的数组里面,把对应位置置为1,每个URL经过个hash映射,在比较理想情况下,数组上会有k个位置设为1。之后没添加进来一个URL,到将其对应的k个位置设为1,这样随着加进来的url数量增多,数组上会有越来越多的1,当然还会有0。

比对时,将新的URL映射一下,比对这映射的k个位置是否都为1,不都为1则表示这个url之前没有遇到过,否则就是遇到过。

这个算法里面会存在一下误差,但是确定好m和k的数量后,准确率很高,而且减少了存储空间,结果还是比较优秀的,具体m,k及失误率的推导计算这里不细讲了,见左程云的讲解。

 
 

看看scrapy 文档的Duplicates filter这一章吧。

简单的方法,就是哈希一下url,把哈希值存到一个set() 里面,抓之前哈希url之后,去判断一下set里面有没有有着url值。

爬虫URL去重的更多相关文章

  1. [爬虫学习笔记]基于Bloom Filter的url去重模块UrlSeen

            Url Seen用来做url去重.对于一个大的爬虫系统,它可能已经有百亿或者千亿的url,新来一个url如何能快速的判断url是否已经出现过非常关键.因为大的爬虫系统可能一秒钟就会下载 ...

  2. [原创]手把手教你写网络爬虫(7):URL去重

    手把手教你写网络爬虫(7) 作者:拓海 摘要:从零开始写爬虫,初学者的速成指南! 封面: 本期我们来聊聊URL去重那些事儿.以前我们曾使用Python的字典来保存抓取过的URL,目的是将重复抓取的UR ...

  3. python scrapy爬虫数据库去重方法

    1. scrapy对request的URL去重 yield scrapy.Request(url, self.parse, dont_filter=False) 注意这个参数:dont_filter= ...

  4. aio 爬虫,去重,入库

    #aio 爬虫,去重,入库 import asyncio import aiohttp import aiomysql import re from pyquery import PyQuery st ...

  5. 【转】larbin中的url去重算法

    1.bloom filter算法 传说中,larbin使用bloom filter算法来进行url去重.那我们就先来了解下bloom filter算法好了. [以下转自:http://hi.baidu ...

  6. 网络爬虫-url索引

    网络爬虫-url索引 http://www.cnblogs.com/yuandong/archive/2008/08/28/Web_Spider_Url_Index.html url索引的作用是判断一 ...

  7. python爬虫主要就是五个模块:爬虫启动入口模块,URL管理器存放已经爬虫的URL和待爬虫URL列表,html下载器,html解析器,html输出器 同时可以掌握到urllib2的使用、bs4(BeautifulSoup)页面解析器、re正则表达式、urlparse、python基础知识回顾(set集合操作)等相关内容。

    本次python爬虫百步百科,里面详细分析了爬虫的步骤,对每一步代码都有详细的注释说明,可通过本案例掌握python爬虫的特点: 1.爬虫调度入口(crawler_main.py) # coding: ...

  8. 爬虫_url去重策略

    如何对url去重? 将访问url保存到数据库中,效率低,最简单 将url保存到set中,查询速度快,但当url达到1亿多条时候,占用太多内存空间 将url经过md5等方法哈希后保存到set中 用bit ...

  9. URL去重与文章去重的一些基本方法

    一.url去重url存到数据库所有url放到set中(一亿条占用9G内存)md5之后放到set中(一亿条占用2,3G的内存)scrapy采用的就是类似方法bitmap方法(url经过hash后映射到b ...

随机推荐

  1. C++ 类 & 对象-类成员函数-类访问修饰符-C++ 友元函数-构造函数 & 析构函数-C++ 拷贝构造函数

    C++ 类成员函数 成员函数可以定义在类定义内部,或者单独使用范围解析运算符 :: 来定义. 需要强调一点,在 :: 运算符之前必须使用类名.调用成员函数是在对象上使用点运算符(.),这样它就能操作与 ...

  2. express4.x Request对象获得参数方法小谈【原创】

    最近看完慕课网 “node.js 建站攻略”后, 对mongodb 操作有了进一步认识, 为了进一步巩固该数据库知识, 于是使用学到的知识搭建一个最简单的mongoDemo. 搭建完成后已放到Gith ...

  3. linux每天一小步---rm命令详解

    1 命令功能 rm命令用于删除文件或者目录,值得注意的是linux下的删除不弯曲等同于windows系统下的删除操作,linux系统下一旦删除了文件或者目录那么它将消失,而windows系统下我们还可 ...

  4. Oracle EBS客户化程序中格式化金额

    在Oracle EBS系统中,随处可见金额的显示格式,通常情况下都具有千分位符,同时有一定位数的精度,让我们先来看看一些现成的例子    上面这些列子中的金额都显示了千分位符,同时具备以2位小数,难道 ...

  5. Android-startService后台运行

    什么时候使用startService? 答:APP在后台长时间运行并执行业务的时候,可以用服务,主要是看服务的特点(在后台长时间运行): Service相关代码: package liudeli.se ...

  6. Android-自定义控件之绘图基础

    画圆形,效果图: 布局中去指定自定义View: <view.custom.androidcustomviewbook.a_draw_base.BaseView android:layout_wi ...

  7. Windows服务器管理与优化

    一.服务器自动重启windows服务器运行时间长了,内存会爆满,比如数据库会缓存大量的数量,IIS进程也会缓存数据而没有及时释放.这样需要定时重启服务器来释放内存. 创建任务计划,如在 每周一/周三/ ...

  8. C++(指针和高级指针)-上篇

    [在指针中存储地址] int *pAge=nullptr; //将PAge声明为int指针,即用于存储int变量的地址 如果将指针初始化为0或者NUll,以后必须将变量的地址赋给它,如下例代码: ; ...

  9. Devexpress GridControl无限高度惹得祸

    异常提示: issue, place the grid into a container that will give a finite height to the grid, or manually ...

  10. 将实体转换为Hashtable

    1.将实体转换为Hashtable,用于将实体参数处理为hashtable,方便sql参数传递 /// <summary> /// 将实体转换为Hashtable /// </sum ...