




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、很土的豆北京大学-技术报告 用heritrix抓取指定网页的探索与源码分析姓 名 一: 付 卓 1001213188姓 名 二: 韩元波 1001213555姓 名 三: 张文娟 1001213574姓 名 四: 赵红梅 1001213576小组 名称: 很 土 的 豆年 级: 2010级 指导 教师: 彭 波 用heritrix抓取指定网页的探索与源码分析【摘 要】Heritrix 是个 archival crawler - 用来获取完整的、精确的、站点内容的深度复制。包括获取图像以及其他非文本内容。抓取并存储相关的内容。对内容来者不拒,不对页面进行内容上的修改。重新爬行对相同的URL不针对
2、先前的进行替换。爬虫通过Web用户界面启动、监控、调整,允许弹性的定义要获取的URL。在本project中,我们需要做的工作正是学习配置使用heritrix,并利用其抓取指定网页。在Week2的web crawler系统结构下, Heritrix系统里面的crawler的下面有四个部分: page fetching、isPageKnown 、isUrlVisited 、Politeness,我们需要分析isUrlVisited 、Politeness代码。其中isUrlVisited作用为:在将链接加入队列之前需要查看链接是否已经被处理过了。而通过对politeness 设置阈值,Heritr
3、ix 可以使用以实现抓取对被访问服务器造成的压力的控制。因此分析isUrlVisited和Politeness源码对于我们理解heritrix工作原理是非常有用的。不同的网页,重要程度不同,在对于网页的重要程度评价我们采用,入度的多少来确定我们抓取的网页的重要程度。在此过程中我们需要利用PageRank算法,来获取抓取回来的网页的入度与出度。通过对此过程的操作与分析,加深了我们对课堂知识的理解。关键词: heritrix配置 isUrlVisited Politeness 源码分析 入度 出度 PageRank算法【引 言】网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称
4、为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁,自动索引,模拟程序或者蠕虫。Heritrix是一个专门为互联网上的网页进行存档而开发的网页检索器。它使用Java编写并且完全开源。它主要的用户界面可以通过一个web流量器来访问并通过它来控制检索器的行为,另外,它还有一个命令行工具来供用户选择调用。Heritrix是由互联网档案馆和北欧国家图书馆联合规范化编写于2003年初。第一次正式发布是在2004年1月,并不断的被互联网档案馆和其他感兴趣的第三方改进着。到现在已经成为一个成熟的开源爬虫,并被广泛使用。本项目的目的在于让我们熟悉网络爬虫的
5、工作原理,学会使用heritrix进行网页抓取并进行简单的源码分析。这个过程中我们主要工作是完成以下三个任务:1. 下载heritrix,在Eclipse中实现 heritrix系统的配置、安装。熟悉Heritrix的使用。利用heritrix抓取指定的网站: 探索单线程与多线程抓取网页的差异2. 在heritrix系统代码中找到crawler的下面两个部分: isUrlVisited,politeness ,并分析其实现技术。3. 搜集web数据的graph link analysis 用PageRank方法获取中网页的数量以及 入度、出度分布情况如何和top 10的最重要页面是哪些。【实现
6、方法】一、 配置heritrix 首先要在电脑上装载Eclipse软件,可直接在网上下载,Eclipse是一个绿色软件下载来以后直接解压后就可以使用。 在 c.zip 。 配置文件进行修改,找到conf下perties文件 /设置端口 heritrix.cmdline.port = 8080 对工程进行jar包引入,将lib下面所有的jar包引入工程。 选择User Entries Advanced选择Add Folders 将conf文件夹添加进去。点击Run 开始运行运行结果:时为配置成功二、 网页抓取登陆http:/localhost.8080/即可登陆herit
7、rix界面,输入用户名和密码,就可以开始建立新的job工程1 单线程抓取 Heritrix提供的配置功能非常丰富,但是也很复杂,刚开始的时候很难正确的创建并且执行一个Job去抓取网站,自己阅读了大部分的Heritrix用户文档和多次尝试之后,得出结论:抓取步骤如下 (1) WUI的上边的导航栏选择Jobs,呈现的第一项是Create New Job,选择第四小项With defaults。输入项的前两项 Name和Description随意,Seeds非常重要:注意最后一个反斜杠必须。(2) 选择下边的Modules,进入Module配置页(Heritrix的扩展功能都是通过模块概念实现的,可
8、以实现自己的模块完成自己想要的功能)。其中第一项 Select Crawl Scope。倒数第三项 Select Writers(3) 选择Modules右边的Submodules,在第一项内容中 crawl-order -scope-decide-rules-rules 删除掉其中的 acceptIfTranscluded () 的这一项抓取作用域的规则。否则当Http请求返回301或者302时Heritrix会去抓取其他域下的网页。 (4) 在WUI的第二行导航栏中选择Settings进入Job的配置页面,其中主要修改两项:http-headers 下的user-agent 和from,他
9、们的PROJECT_URL_HERE 和 CONTACT_EMAIL_ADDRESS_HERE 替换为自己的内容(PROJECT_URL_HERE 要以 http:/ 开头) (5) 在WUI的第二行导航栏中选择最右边的Submit job(6) 在WUI的第一行导航栏中选择第一项的Console,点击Start,抓取任务正式开始,时间长短有网络状况和所抓取网站的深度有关。2. 多线程抓取 方法:利用ELFHash策略多线程抓取网页步骤: 在该类下编写代码如下: public class ELFHashQueueAssignmentPolicy extends QueueAssignmentP
10、olicy private static final Logger logger = Logger .getLogger(ELFHashQueueAssignmentPolicy .class.getName(); public String getClassKey(CrawlController controller, CandidateURI cauri) String uri = cauri.getUURI().toString(); long hash = ELFHash(uri); String a = Long.toString(hash % 100); return a; pub
11、lic long ELFHash(String str) long hash = 0; long x = 0; for(int i = 0; i str.length(); i+) hash = (hash 24); hash &= x; return (hash & 0x7FFFFFFF); 修改AbstractFrontier 类的AbstractFrontier方法 : 关键代码段是: ELFHashHostnameQueueAssignmentPolPattern p = Ppile(s*,s*|s+);String queues = p.split(queueStr); 其中红色部分
12、是新加的代码。 修改perties 中的配置# F R O N T I E R# List here all queue assignment policies youd have show as a# queue-assignment-policy choice in AbstractFron ELFHashQueueAssignmentPolicy 加粗部分需要修改。 单线程在抓取过程中大约需要8天左右,而多线程十几个甚至几个小时就可以抓完。抓取的crawl job report 和抓取的过程中多线程进度如下图所示:三、 源码分析 (一)分析isURLVisited
13、 这主要是在Frontier里实现的,当一个链接要进入等待队列时需要先判断是否已经被抓取过,如果已经抓取过则不进入,否则进入。其中最重要的部分就是存储已抓取url的结构。为了提高效率,Heritrix在内部使用了Berkeley DB,BdbFrontier是唯一个具有实际意义的链接工厂。Heritrix中涉及存储url的主要的类有UriUniqFilter、FPMergeUriUniqFilte、SetBasedUriUniqFilter、BdbUriUniqFilter、 BloomUriUniqFilter、 emFPMergeUriUniqFilter和DiskFPMergeUriUn
14、iqFilter。用户可以在创建一个爬取任务时选择BdbUriUniqFilter, BloomUriUniqFilter, emFPMergeUriUniqFilter和DiskFPMergeUriUniqFilter中的一种。默认是BdbUriUniqFilter。对于BdbUriUniqFilter这里存储已经处理过的url的数据结构是Berkeley Database,叫做alreadySeen。声明代码如下:protected transient Database alreadySeen = null;Berkeley DB,它是一套开放源代码的嵌入式数据库。简单的说,Berkele
15、y DB就是一个Hash Table,它能够按“key/value”方式来保存数据。使用Berkeley DB时,数据库和应用程序在相同的地址空间中运行,所以数据库操作不需要进程间的通讯。另外,Berkeley DB中的所有操作都使用一组API接口。因此,不需要对某种查询语言(比如SQL)进行解析,也不用生成执行计划,这就大大提高了运行效率。算法:为了节省存储空间,alreadySeenUrl中存储的并不是url,而是url的fingerprint。为了不破坏url的局部性,分别对url的主机名和整个url计算fingerprint,然后把24位的主机名fingerprint和40位的url的
16、fingerprint连接起来得到最后的64位的fingerprint。计算fingerprint是在createKey函数中实现。关键代码如下如下:CharSequence hostPlusScheme = (index = -1)? url: url.subSequence(0, index); setAdd函数把uri加入到数据库中,如果已经存在,则返回false,否则返回true。关键代码如下:status = alreadySeen.putNoOverwrite(null, key, ZERO_LENGTH_ENTRY);setRemove函数把uri从数据库中删除,如果成功则返回t
17、rue,否则返回false。关键代码如下:status = alreadySeen.delete(null, key);(二)分析politeness1. one connection at a timeHeritrix的礼貌性主要在Frontier中实现:一次对一个服务器只开一个链接,并且保证uri按一定速率处理,从而不会给被爬取的服务器造成负担。数据结构:爬虫采用宽度优先遍历,使用FIFO的队列来存储待爬取的URL。因为网页的局部性,队列中相邻的URL很可能是相同主机名的,这样爬取会给服务器造成很大负担。如果用很多队列来存放URL,每个队列中URL的主机名相同,同一时间里,只允许队列中一个
18、URL被爬取,就能避免上述问题了。heritrix中主机名相同的URL队列是用WorkQueue来实现的,一个WorkQueue就是一个具有相同主机名的队列。frontier中用Map类型的allQueues存储着主机名和相应的队列;snoozedClassQueues存储着所有休眠的url队列的key,它们都按唤醒时间排序;readyClassQueues存储着已经准备好被爬取的队列的key;inactiveQueues存储着所有非活动状态的url队列的key;retiredQueues存储着不再激活的url队列的key。算法:线程返回readyClassQueues和snoozedClas
19、sQueues中已经到唤醒时间的队列中第一个url,下载相应的文档,完成之后从队列中移除该url。每爬取到一个url都需要判断应该加入哪个队列中。 首先根据url的主机名判断是否存在该主机名的队列,如果不存在就新建一个队列。然后判断该队列是否在生命周期内,如果不在就设置为在生命周期内。如果队列需要保持不激活状态或者活动队列的数量超过设定的阈值,就把该队列放入inactiveQueues中,否则放在readyClassQueues中。另外,heritrix还设定了很多参数来限制对服务器的访问频率。如最长等待时间max-delay-ms,默认30秒;重连同一服务器至少等待时间min-delay-m
20、s,默认是3秒,重连同一服务器要等待上次连接至今时间间隔的几倍delay-factor,默认是5。当然这些参数用户也可以在配置爬虫的时候自己设定。 2. robots.txtrobots.txt称为机器人协议,放在网站的根目录下。在这个文件中声明该网站中不想被robot 访问的部分,或者指定搜索引擎只收录指定的内容。这是一个君子协定,爬虫可以不遵守,但是出于礼貌最好遵守。heritrix在预处理阶段处理robots.txt。它把针对每个user-agent的allow和disallow封装为一个RobotsDirectives类,整个robots.txt用一个Robotstxt对象来存储。he
21、ritrix处理robots.txt有五种方法,都封装在RobotsHonoringPolicy中。这五种方法分别是:Classic:遵守robots.txt对当前user-agent的第一部分指令。Ignore:忽略robots.txt。Custom:遵守robots.txt中特定操作的指令。Most-favored:遵守最宽松的指令。Most-favored-set:给定一些user-agent格式的集合,遵守最宽松的限制。当策略是Most-favored或Most-favored-set时,可以选择是否伪装成另一个user agent。RobotsExlusionPolicy类中包含he
22、ritrix最终处理robots.txt的方法,disallows用来判断userAgent能否访问某个url。它完全依据用户在新建一个爬虫任务时设置的处理robots.txt的策略来实现。此部分参考【注】更详细内容可参考我们小组博客四、 抓取网页数入度出度与top10 在计算链入链出关系是可有多种方法: 分析crawl.log:通过观察crawl.log,可以看到url与url之间的关系。 分析抓取得到的网页,从网页中找到链接关系。 修改Heritrix源码,在抓取过程中存储链接关系我们使用方法二的思想编写代码计算抓取的网页数量,获取链入链处关系。(一) 抓取的网页数统计在抓取网页过程中经过程序遍历共计算得到抓取网页数量为: 18901个网页出度分析:Heritrix抓取的所有网页进行逐一遍历,因为 都是链出链接(如上图所示),找到每个网页的链出链接,即得到每个网页的出度(不过在找链出链接的过程中,有mailto链接和javascript代码,将这些链出的链接去掉不作为网页的出度)。 入度分析:在遍历每个网页寻找出度的过程中,是用哈希表是用来存放网页
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 形体房安全管理制度
- 彻底不用气管理制度
- 德力西福利管理制度
- 心里催眠室管理制度
- 快递操作间管理制度
- 急冻库安全管理制度
- 总监办会议管理制度
- 成品罐使用管理制度
- 我校培训费管理制度
- 掘进市场化管理制度
- 2025年湖北省高考政治试卷真题(含答案)
- 广东省深圳市宝安区2023-2024学年二年级下册期末测试数学试卷(含答案)
- 2025江苏扬州宝应县“乡村振兴青年人才”招聘67人笔试备考试题及参考答案详解
- 2025公基题库(附答案解析)
- 2025年宁夏银川灵武市选聘市属国有企业管理人员招聘笔试冲刺题(带答案解析)
- 三大监测培训试题及答案
- 两办意见宣贯考试题及答案
- 2025年汽车驾照考试科目一考试题库及参考答案
- 跨文化交际知识体系及其前沿动态
- 音响安装施工合同协议
- 日本签证个人信息处理同意书
评论
0/150
提交评论