爬虫URL去重
这个要看你想抓取的网页数量是哪种规模的。
如果是千万以下用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去重的更多相关文章
- [爬虫学习笔记]基于Bloom Filter的url去重模块UrlSeen
Url Seen用来做url去重.对于一个大的爬虫系统,它可能已经有百亿或者千亿的url,新来一个url如何能快速的判断url是否已经出现过非常关键.因为大的爬虫系统可能一秒钟就会下载 ...
- [原创]手把手教你写网络爬虫(7):URL去重
手把手教你写网络爬虫(7) 作者:拓海 摘要:从零开始写爬虫,初学者的速成指南! 封面: 本期我们来聊聊URL去重那些事儿.以前我们曾使用Python的字典来保存抓取过的URL,目的是将重复抓取的UR ...
- python scrapy爬虫数据库去重方法
1. scrapy对request的URL去重 yield scrapy.Request(url, self.parse, dont_filter=False) 注意这个参数:dont_filter= ...
- aio 爬虫,去重,入库
#aio 爬虫,去重,入库 import asyncio import aiohttp import aiomysql import re from pyquery import PyQuery st ...
- 【转】larbin中的url去重算法
1.bloom filter算法 传说中,larbin使用bloom filter算法来进行url去重.那我们就先来了解下bloom filter算法好了. [以下转自:http://hi.baidu ...
- 网络爬虫-url索引
网络爬虫-url索引 http://www.cnblogs.com/yuandong/archive/2008/08/28/Web_Spider_Url_Index.html url索引的作用是判断一 ...
- python爬虫主要就是五个模块:爬虫启动入口模块,URL管理器存放已经爬虫的URL和待爬虫URL列表,html下载器,html解析器,html输出器 同时可以掌握到urllib2的使用、bs4(BeautifulSoup)页面解析器、re正则表达式、urlparse、python基础知识回顾(set集合操作)等相关内容。
本次python爬虫百步百科,里面详细分析了爬虫的步骤,对每一步代码都有详细的注释说明,可通过本案例掌握python爬虫的特点: 1.爬虫调度入口(crawler_main.py) # coding: ...
- 爬虫_url去重策略
如何对url去重? 将访问url保存到数据库中,效率低,最简单 将url保存到set中,查询速度快,但当url达到1亿多条时候,占用太多内存空间 将url经过md5等方法哈希后保存到set中 用bit ...
- URL去重与文章去重的一些基本方法
一.url去重url存到数据库所有url放到set中(一亿条占用9G内存)md5之后放到set中(一亿条占用2,3G的内存)scrapy采用的就是类似方法bitmap方法(url经过hash后映射到b ...
随机推荐
- CSS—— em的详解
字体大小在浏览器的默认样式表中有规定.一般采用em为单位,也就是相对单位,1em=16像素. 同时,像P h1等等标签都采用浏览器默认的em单位,P为1em,h1为2em等等. 两条重要的规则: 1. ...
- Xcode使用心得01:断点中断问题和调整编译目标[转]
在obj-c系列博文里,我们粗浅的介绍了obj-c的一些语法以及F库中的一些标准类的使用,但是实际编写拿得出手的APP还是得老老实实在os x上用Xcode写啊!最近上网无意中发现还有支持os x和i ...
- JavaScript语言精粹 笔记06 方法
JS包含了少量可用在标准类型上的标准方法. ArrayFunctionNumberObjectRegExpString Array array.concat(item...) concat方法返回一个 ...
- SQLITE3的锁以及事务
以下内容摘自<SQLITE权威指南>,下载地址http://download.csdn.net/detail/cxjchen/5643391 SQLITE的锁 在SQLite中,锁和事 ...
- Web 应用简单测试方案
测试:一定要分阶段测试,先确定入队列成功,再测试队列的执行是否成功. 功能点: 1. 翻页2. 加精3. 置顶4. 帖子浏览量(PV)5. 发帖6. 回复7. 评论 8. crontab 脚本 @20 ...
- 修改VS中的附加依赖项的继承值
工程用不到的库,想去都去不掉,一直链接错误... 解决方法:打开vs的“属性管理器”窗口.通过这个窗口就可以对里面的继承值进行编辑了 另,“属性管理器”这个窗口,一般在“其他窗口”选项里(至少VS20 ...
- excel中如何让每n行显示同一个数据
由于需要将数据按照下表格式存储,以方便读取展示,年份列需要每隔7行再递增1 方法: 1. 输入这个公式: = INT((ROW(E1)-1)/ 5)+ 1 进入一个空白单元格,您可以在其中填写序列号, ...
- Asp.NetCore安全验证之JWT
本文只是介绍了下基于AspNetCore自带的System.IdentityModel.Tokens.Jwt.dll工具在项目中Token的应用. 我这里谈到的很浅显就两点: 一,超时时间 二,数据的 ...
- sqlserver常用函数
1.字符串函数 --ascii函数,返回字符串最左侧字符的ascii码值 SELECT ASCII('dsd') AS asciistr --ascii代码转换函数,返回指定ascii值对应的字符 ) ...
- mac下wordpress环境搭建
mac下本来就有apache和php,只需要配置以下+安装mysql 1.Apache 预装目录在 /etc/apache2: 默认的网站目录在 /Library/WebServer/Documen ...