这个要看你想抓取的网页数量是哪种规模的。
如果是千万以下用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. Exception in thread "main" java.lang.Error: Unresolved compilation problem

    初学java,使用eclipse编译时,可能会遇到如下图所示的编译错误(Exception in thread "main" java.lang.Error: Unresolved ...

  2. WebDriver高级应用——操作Web页面的滚动条

    目的: (1)滑动页面的滚动条到页面最下方 (2)滑动页面的滚动条到页面某个元素 (3)滑动页面的滚动条向下移动某个数量的像素 测试的网址: http://www.seleniumhq.org/ 代码 ...

  3. iptables 增删查改

    一,安装并启动防火墙 二.添加防火墙规则 1.添加filter表 2.添加nat表 指定位置添加 三.删除iptables规则 四.查看防火墙规则 1.查看filter表 2.查看nat表 五.修改规 ...

  4. 3、Docker能干什么?

    简化配置   这是Docker公司宣传的Docker的主要使用场景.虚拟机的最大好处是能在你的硬件设施上运行各种配置不一样的平台(软件.系统),Docker在降低额外开销的情况下提供了同样的功能.它能 ...

  5. 咏南新CS插件开发框架支持DELPHI7

    咏南新CS插件开发框架支持DELPHI7 适用软件:基于数据管理的应用软件适用行业:生产制造.物流.贸易.零售行业的ERP.MRP.CRM.MIS.MES.POS等基于C/S架构的数据库管理系统 运行 ...

  6. CentOS 系统状况查看

    1 磁盘 iostat    安装 yum install sysstat iostat -x Linux -.el7.x86_64 (sdw2) 2017年03月07日 _x86_64_ ( CPU ...

  7. byte[] 数组和字符串的转换,与byte[] 数组和int类型的之间的转化

    我们先来看看byte bool  int ushort  等的定义 首先时byte[]数组与string之间的转换 string 转换位byte[] 数组 string str = "1-1 ...

  8. @ManyToOne和@OneToMany 注解

    (1)ManyToOne(多对一)单向:不产生中间表,但可以用@Joincolumn(name="  ")来指定生成外键的名字,外键在多的一方表中产生! (2)OneToMany( ...

  9. JAVA中的static关键字(静态变量和成员变量)

    static的特点: 1.static是一个修饰符,用于修饰成员: 2.static修饰的成员被所有的对象所共享: 3.static优先于对象存在,因为static的成员随着类的加载就已经存在了: 4 ...

  10. poj 3133 Manhattan Wiring

    http://poj.org/problem?id=3133 考虑插头 dp 用四进制表示一个插头的状态,0 表示没有插头,2 表示这个插头是连接两个 2 的,3 同理 然后就是大力分类讨论了 这题还 ...