- 浏览: 200649 次
文章分类
最新评论
-
code_xiaoke:
session可是有30分钟有效期的还有如果在分布式的环境下 ...
Java Web 用户登陆示例代码 -
xul0038:
http://www.baidu.com
Java Web 用户登陆示例代码 -
16866:
非常棒,配置信息呢
Nginx负载均衡 -
开发小菜:
什么意思,没明白?能不能写一个例子
JS 实现DIV随浏览器窗口大小变化
在爬虫启动工作的过程中,我们不希望同一个网页被多次下载,因为重复下载不仅会浪费CPU机时,还会为搜索引擎系统增加负荷。而想要控制这种重复性下载问题,就要考虑下载所依据的超链接,只要能够控制待下载的URL不重复,基本可以解决同一个网页重复下载的问题。
非常容易想到,在搜索引擎系统中建立一个全局的专门用来检测,是否某一个URL对应的网页文件曾经被下载过的URL存储库,这就是方案。
接着要考虑的就是如何能够更加高效地让爬虫工作,确切地说,让去重工作更加高效。如果实现去重,一定是建立一个URL存储库,并且已经下载完成的URL在进行检测时候,要加载到内存中,在内存中进行检测一定会比直接从磁盘上读取速度快很多。
我们先从最简单的情况说起,然后逐步优化,最终得到一个非常不错的解决方案。
第一,基于磁盘的顺序存储。
这里,就是指把每个已经下载过的URL进行顺序存储。你可以把全部已经下载完成的URL存放到磁盘记事本文件中。每次有一个爬虫线程得到一个任务
URL开始下载之前,通过到磁盘上的该文件中检索,如果没有出现过,则将这个新的URL写入记事本的最后一行,否则就放弃该URL的下载。
这种方式几乎没有人考虑使用了,但是这种检查的思想是非常直观的。试想,如果已经下载了100亿网页,那么对应着100亿个链接,也就是这个检查
URL是否重复的记事本文件就要存储这100亿URL,况且,很多URL字符串的长度也不小,占用存储空间不说,查找效率超级低下,这种方案肯定放弃。
第二,基于Hash算法的存储。
对每一个给定的URL,都是用一个已经建立好的Hash函数,映射到某个物理地址上。当需要进行检测URL是否重复的时候,只需要将这个URL进
行Hash映射,如果得到的地址已经存在,说明已经被下载过,放弃下载,否则,将该URL及其Hash地址作为键值对存放到Hash表中。
这样,URL去重存储库就是要维护一个Hash表,如果Hash函数设计的不好,在进行映射的时候,发生碰撞的几率很大,则再进行碰撞的处理也非常复杂。而且,这里使用的是URL作为键,URL字符串也占用了很大的存储空间。
第三,基于MD5压缩映射的存储。
MD5算法是一种加密算法,同时它也是基于Hash的算法。这样就可以对URL字符串进行压缩,得到一个压缩字符串,同时可以直接得到一个
Hash地址。另外,MD5算法能够将任何字符串压缩为128位整数,并映射为物理地址,而且MD5进行Hash映射碰撞的几率非常小,这点非常好。从另
一个方面来说,非常少的碰撞,对于搜索引擎的爬虫是可以容忍的。况且,在爬虫进行检测的过程中,可以通过记录日志来保存在进行MD5时发生碰撞的URL,
通过单独对该URL进行处理也是可行的。
下面就是是对URL进行压缩的MD5方法,对URL字符串进行压缩:
- public static String md5(String string) {
- char hexDigits[] = { '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' , 'a' , 'b' , 'c' , 'd' ,
- 'e' , 'f' };
- try {
- byte [] bytes = string.getBytes();
- MessageDigest messageDigest = MessageDigest.getInstance("MD5" );
- messageDigest.update(bytes);
- byte [] updateBytes = messageDigest.digest();
- int len = updateBytes.length;
- char myChar[] = new char [len * 2 ];
- int k = 0 ;
- for ( int i = 0 ; i < len; i++) {
- byte byte0 = updateBytes[i];
- myChar[k++] = hexDigits[byte0 >>> 4 & 0x0f ];
- myChar[k++] = hexDigits[byte0 & 0x0f ];
- }
- return new String(myChar);
- } catch (Exception e) {
- return null ;
- }
- }
在Java中有一个Map类非常好,你可以将压缩后的URL串作为Key,而将Boolean作为Value进行存储,然后将工作中的Map在爬
虫停止工作后序列化到本地磁盘上;当下一次启动新的爬虫任务的时候,再将这个Map反序列化到内存中,供爬虫进行URL去重检测。
第四,基于嵌入式Berkeley DB的存储。
Berkeley DB的特点就是只存储键值对类型数据,这和URL去重有很大关系。去重,可以考虑对某个键,存在一个值,这个值就是那个键的状态。
使用了Berkeley DB,你就不需要考虑进行磁盘IO操作的性能损失了,这个数据库在设计的时候很好地考虑了这些问题,并且该数据库支持高并发,支持记录的顺序存储和随机存储,是一个不错的选择。
URL去重存储库使用Berkeley DB,压缩后的URL字符串作为Key,或者直接使用压缩后的URL字节数组作为Key,对于Value可以使用Boolean,一个字节,或者使用字节数组,实际Value只是一个状态标识,减少Value存储占用存储空间。
第五,基于布隆过滤器(Bloom Filter)的存储。
使用布隆过滤器,设计多个Hash函数,也就是对每个字符串进行映射是经过多个Hash函数进行映射,映射到一个二进制向量上,这种方式充分利用了比特位。
不过,我没有用过这种方式,有机会可以尝试一下。
可以参考Google的
- http://www.googlechinablog.com/2007/07/bloom-filter.html
转自:
- http://hi.baidu.com/shirdrn/blog/item/40ed0fb1ceac4d5c0923029d.html
发表评论
-
java实现动态切换上网IP (ADSL拨号上网) java开发
2013-04-24 10:06 1305动态切换IP的实现主是也由Windows的rasdial命令提 ... -
JAVA字符串处理函数
2013-04-12 09:21 1157Java中的字符串也是一连串的字符。但是与许多其他的计算机语 ... -
(转)Lucene打分规则与Similarity模块详解
2013-02-06 14:08 1211搜索排序结果的控制 Lu ... -
Compass将lucene、Spring、Hibernate三者结合
2013-02-01 11:02 1679版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声 ... -
Lucene3.0详解
2013-02-01 10:57 1420★第一部分:概述 1. 我 ... -
Java Web 用户登陆示例代码
2013-02-01 09:56 58118实现功能: 1、用户登陆、注销 2、利用session记 ... -
Java对数函数及Java对数运算
2013-02-01 09:47 6799Java对数函数的计算方法非常有问题,然而在API中却有惊人 ... -
Lucene为不同字段指定不同分词器(转)
2013-01-31 17:34 3478在lucene使用过程中,如 ... -
域名管理与解析原理 — 《Java邮件开发详解》读书笔记
2013-01-31 14:56 1727一 基本概念 1. 域名:域名是由圆点分开一串单词或缩写组 ... -
优秀的Java工程师需要掌握的10项技能
2013-01-31 14:04 1864编程专业相对于计算机领域其他专业来讲,是一门比较难以修炼的专业 ... -
Web开发入门不得不看
2013-01-28 17:31 1038如今,各种互联网的Web ... -
MVC框架的映射和解耦
2013-01-25 21:37 836最近在写一个业务上用到的框架,回想起接触过的一些MVC框架, ... -
JAVA发送EMAIL的例子
2013-07-09 09:44 908import javax.mail.*; ... -
SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎
2012-11-19 09:55 1388前两天看到了一个中国新闻网,这个网站的搜索form的actio ... -
Lucene多字段搜索
2012-11-19 09:53 1043最近在学习Lucene的过程中遇到了需要多域搜索并排序的问题, ... -
lucene之sort
2012-11-16 15:06 1096package cn.zqh.lucene.sort; im ... -
Nginx负载均衡
2012-11-16 11:45 7671最近迷上了Nginx,真实麻雀虽小,五脏俱全..功能实在强大. ... -
Lucene相关度排序的调整
2012-11-16 11:38 1732Lucene的搜索结果默认按 ... -
HashSet重复元素判断
2012-10-15 16:37 9143HashSet不能添加重复的元素,当调用add(Object) ... -
JAVA提高教程(2)-认识Set集合之HashSet
2012-10-09 09:44 977集合在Java里面的作用非 ...
相关推荐
综上所述,哈尔滨工业大学信息检索研究室提出的大规模网页快速去重算法,通过创新的特征码技术与B-Tree索引策略,成功解决了传统聚类方法在处理大规模网页去重问题上的局限,展现了卓越的处理能力和精确度,对优化...
【网页去重策略】是指在搜索引擎或其他数据抓取系统中,为了避免下载和处理重复的网页内容,采取的一种技术手段。这种策略通常分为两步:同源网页去重和内容去重。 1. **同源网页去重**: 同源网页去重主要通过...
综上所述,本文提出的基于特征码和文章长度相结合的网页去重改进方法,解决了原有特征码方法的一些关键问题,如对句号位置的过分依赖以及缺乏对文章整体内容的全面考量。通过综合考量特征码与文章长度,该方法在提高...
为了有效地实现网页正文去重,本研究设计了一个网页去重系统,其主要结构包括以下几个关键步骤: 1. **预处理阶段**:提取网页正文信息,屏蔽掉网页标题、导航栏等非正文内容。 2. **特征码生成**:根据提取出的...
总结起来,基于云平台的消除近似重复网页方法利用云计算的强大资源,实现了高效、大规模的网页去重,有助于提升信息检索的准确性和效率。随着大数据和人工智能技术的发展,这种方法还将继续演进,以应对更复杂的网络...
在互联网出现之前,“抄”很不方便,一是“源”少,而是发布渠道少;而在互联网出现之后,“抄”...文章去重(或叫网页去重)是根据文章(或网页)的文字内容来判断多个文章之间是否重复。这是爬虫爬取大量的文本行网页
相比于传统的查找方法如哈希表或二叉树等,Bloom Filter占用空间少,并且查询速度快,非常适合用于大数据集中的元素快速查询。 #### 二、Bloom-Filter算法的基本思想 Bloom Filter的核心思想是通过多个不同的哈希...
- 传统伪原创方法(替换词汇、调整段落)可能无法逃脱搜索引擎的去重策略。理解搜索引擎如何识别重复内容(如指纹提取)有助于创建更高质量、更独特的内容,提高页面排名。 6. **内容与模板的组合**: - 相同内容...
3. **SEO优化**:搜索引擎对重复内容有着严格的惩罚机制,因此在进行大规模内容采集之前最好采取一定措施进行去重处理,确保每个页面都是独一无二的。 通过上述分析可见,“A5站长网全部织梦采集规则”为那些希望...
关于内容优化,传统的伪原创方法如简单的替换词汇和调整段落,已经无法满足当前搜索引擎的去重策略。搜索引擎会通过提取页面的“指纹”(独特的词或短语组合)来判断内容的原创性。因此,提高伪原创效率的方法是理解...