爬虫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 ...
随机推荐
- PHP(八)数组
- 深入解析String#intern
转自:https://tech.meituan.com/in_depth_understanding_string_intern.html 深入解析String#intern john_yang ·2 ...
- Python入门基础学习 一
Python入门基础学习 一 Python下载及安装 下载地址:https://www.python.org/,选择最新的版本下载 稍等一会,安装完成. 简单语句 从idle启动Python:IDLE ...
- MSP430 G2553 LaunchPad GPIO中断
P1.P2端口上的每个管脚都支持外部中断.P1端口的所有管脚都对应同一个中断向量(Interrupt Vector),类似的,P2端口的所有管脚都对应另一个中断向量:通过PxIFG寄存器来判断中断来源 ...
- mysql5.7 column cannot be null
背景 独立测试环境安装了数据库,但安装的版本是mysql 5.7的版本,而研发用的是mysql5.6的版本,在执行某个数据库操作的提示,提示column “xxxx”cannot be null 问题 ...
- SQL LEAD()函数 LAG()函数
lag ,lead 分别是向前,向后:lag 和lead 有三个参数,第一个参数是列名,第二个参数是偏移的offset,第三个参数是 超出记录窗口时的默认值) SQL> select id,na ...
- 10-10Linux的文件操作函数以及所需头文件
Linux的基本文件操作函数 Linux通过相应的对文件的IO函数来实现对文件的操作,这些函数通常被称作"不带缓冲的IO",这是因为他们都是通过调用Linux的内核调用来实 ...
- js 倒计时,转义
function leftTimer(time) { var leftTime = (new Date(time)) - (new Date()); //计算剩余的毫秒数 var days = par ...
- DataGridView添加一行数据、全选、取消全选、清空数据、删除选中行
.net 2005下的Windows Form Application,一个DataGridView控件和4个Button,界面设置如下: 代码如下,有注解,相信大家都看得明白: ...
- hdu X问题 (中国剩余定理不互质)
http://acm.hdu.edu.cn/showproblem.php?pid=1573 X问题 Time Limit: 1000/1000 MS (Java/Others) Memory ...