这个要看你想抓取的网页数量是哪种规模的。
如果是千万以下用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. (转)centos liveCD liveDVD netinstall minimal DVD1 DVD2 版本区别

    LiveCD 和 LiveDVD 是可以直接光盘运行系统,但不能安装,两者差别在于容量大小,dvd包含的软件要多一些. netinstall 是用于网络安装和系统救援的镜像文件. minimal 这个 ...

  2. break,continue以及pass的使用

    1.break是提前结束循环 for i in range(1,100): if i%2 == 0: print("wrong") break#直接结束循环,并且不打印下面的pri ...

  3. Centos 7 安装 mysql5.7

    1.需要下载mysql 下载地址:http://dev.mysql.com/downloads/mysql/ 2.将下载的rpm包上传到centos 7上(我是放在根下面的opt目录) 3. 安装my ...

  4. [label][JavaScript扩展] JavaSCript扩展

    http://www.idangero.us/sliders/swiper/ ,swipper for mobile terminal.

  5. R12.1.3 patch9239090

    参考文档:Oracle E-Business Suite Release 12.1.3 Readme [ID 1080973.1]1.调整参数_disable_fast_validate=TRUEpg ...

  6. 咏南BS开发框架

    咏南BS开发框架 开发工具为:DELPHI 2006及以上版本.欢迎索取演示. 通用的三级权限管理. 登录验证 输入帐号和密码验证登录系统. 功能菜单 在这里设置好菜单,系统运行的时候会根据菜单设置动 ...

  7. Flask数据库

    一 数据库的设置 Web应用中普遍使用的是关系模型的数据库,关系型数据库把所有的数据都存储在表中,表用来给应用的实体建模,表的列数是固定的,行数是可变的.它使用结构化的查询语言.关系型数据库的列定义了 ...

  8. 配置IIS Express,支持JSON

    方法有2种: 1. 命令行 a. cd "iis express的安装目录"  例如:cd C:\Program Files (x86)\IIS Express b. appcmd ...

  9. SQL datediff()函数 时间差

    定义和用法 DATEDIFF() 函数返回两个日期之间的天数. 语法 DATEDIFF(datepart,startdate,enddate) startdate 和 enddate 参数是合法的日期 ...

  10. linux的mount命令详解

    最近在操作京东云服务器,挂在硬盘,分区等操作,重新温习了一下mount命令: linux下挂载(mount)光盘映像文档.移动硬盘.U盘.Windows和NFS网络共享. linux是个优秀的开放源码 ...