西邮大三狗!!!
分类: Python/Ruby
2014-09-10 17:22:34
1.创建一个新的WebDb (admin db -create);
2.将抓取起始URLs写入WebDB中 (inject);
3.根据WebDB生成fetchlist并写入相应的segment(generate);
4.根据fetchlist中的URL抓取网页 (fetch).;
5.根据抓取网页更新WebDb (updatedb).
通过3—5这个循环就可以实现Nutch的深度抓取。
在nutch爬虫运行后在webdb文件夹下一共产生如下五个文件:
linksByMD5 linksByURL pagesByMD5 pagesByURL stats
Stats文件用来存放爬虫爬行后的版本信息,处理网页数量,连接数量;
pagesByURL等其余四个文件夹下均有两个文件――index和data,其中data文件用来存放有序的key/value对,
排序是通过选择不
同的key和comparator来改变的,当然里面会有一些其他信息,
比如在pagesByURL中,就每隔
一定长度的key/value对放入一个用来定位的信息(syn);index文件用来存放索引,但是这个索引文件
也是一个
有序的,这个里面存放的是key和位置信息,但是在data文件中出现的key在这个index中都能找到的,它为了节省空间,
实施了每隔一段
key/value建立一条索引,这样在查找的时候,因为是有序的,所以采用2分查找,如果找不到,则
返回最后时候的最小的位置信息,这个位置离我们要找
的目标是相当近的,然后在data文件的这个位置向前找就可以很快找到了
nutch维持这个webdb的方式是,在填加,删除网页或者连接时,并不是直接向这个webdb中填加网页或者连接,
而是在
WebDBWriter
中的内部类PageInstructionWriter或者LinkInstructionWriter中填加一条对网页操作的命令,
然后最后对存放的命
令进行排序去重,最后将这个命令与现有的webdb中存放的网页数据进行合并;
Fetcher类是进行实际网页抓取时候运行的类,爬虫产生的文件或文件夹都是由这个类产生的, Nutch提供了选项―
是否对抓回的网页进行parse(解析),如果这个选项设置为false,将没有parseddata和parsedtext这两个文件夹。
segments文件分析
nutch爬虫产生的文件几乎都是key/value对,不同的只是key/value的种类和值不同,爬虫运行后在segments文件夹的子
文件夹产生如下几个文件夹:
content fetcher fetchlist index parse_data parse_text
其中content文件夹存放的内容对应protocol包中的content类;fetcher文件夹存放的内容对应的是fetcher包中的
FetcherOutput类;fetchlist对应pagedb包总的fetchlist类;parse_data和parse_text分别对应
parse包中的ParseData和ParseText类
提示:
Lucene 中的segment和Nutch中的不同,Lucene中的segment是索引index的一部分,但是Nutch中的segment
只是WebDB中 各个部分网页的内容和索引,最后通过其生成的index跟这些segment已经毫无关系了。
-----------------------------------------------------------------------------------------------------------
Nutch深度抓取的5个步骤细节
http://hi.baidu.com/shirdrn/blog/item/16c8d33df49893e83d6d972d.html
-----------------------------------------------------------------------------------------------------------
Nutch工作流程:建立初始URL集合分析
初始URL集的建立有两种方式:超链接和站长提交。
超链接 是指机器人程序根据网页链到其他网页中的超链接,就像日常生活中所说的“一传十,十传百……”一样,从少数几
个网页开始,连到数据库上所有到其他网页的链接。理论上,若网页上有适当的超连结,机器人便可以遍历绝大部分网页。
站长提交 是指在实际运行中,爬虫不可能抓取到所有站点,为此,网站站长可以向搜索引擎进行提交,要求收录,搜索引
擎经过核查之后,便将该网站加入到URL集合中,进行抓取。
Nutch工作流程:inject操作分析
inject操作调用的是nutch的核心包之一crawl包中的类org.apache.nutch.crawl.Injector。它执行的结果是:crawldb数据
库内容得到更新,包括URL及其状态。inject操作主要作用可以从下面3方面来说明:
(1) 将URL集合进行格式化和过滤,消除其中的非法URL,并设定URL状态(UNFETCHED),按照一定方法进行初始化分值;
(2) 将URL进行合并,消除重复的URL入口;
(3) 将URL及其状态、分值存入crawldb数据库,与原数据库中重复的则删除旧的,更换新的。
Nutch工作流程:generate操作分析
generate
操作调用的是crawl包中的类org.apache.nutch.crawl.Generator。它执行的结果是:创建了抓取
列表,存放于
segments目录下,以时间为文件夹名称。循环抓取多少次,segments文件夹下就会有多少个以时间为名称的文件夹。
generate操作主要作用可以从下面3方面来说明:
(1) 从crawldb数据库中将URL取出并进行过滤;
(2) 对URL进行排序,通过域名、链接数和一种hash算法综合进行降序排列;
(3) 将排列列表写入segments目录中。
Nutch工作流程:fetch操作分析
fetch操作调用的是fetcher包中的类org.apache.nutch.fetcher.Fetcher。它执行的结果是:将页面内容抓取下来,
存于segment目录下。fetch操作主要作用可以从下面4方面来说明:
(1) 执行抓取,按照segments目录下的抓取列表进行;
(2) 抓取过程中,页面的URL地址可能因为链接发生改变,从而需要更新URL地址;
(3) 抓取采用多线程方式进行,以提高抓取速度;
(4) fetch操作过程中调用了parse操作。
Nutch工作流程:parse操作分析
parse操作调用的是parse包中的类org.apache.nutch.parse.ParseSegment。它执行的结果是:将fetch得到的
页面解析为text和data,存于segments目录下。parse操作主要作用可以从下面3方面来说明:
(1) 解析segment中由fetch得到的页面,并进行整理,将页面分成为parse-date和parse-text;
(2) parse-date中保存的是页面的题名、作者、日期、链接等内容;
(3) parse-text中保存的是页面的文本内容。
Nutch工作流程:updatedb操作分析
updatedb操作调用的是crawl包中的类org.apache.nutch.crawl.CrawlDb。它执行的结果是:更新了crawldb数据库,
为下一轮抓取做准备。updatedb操作主要作用如下:
根据segments目录下fetch目录和parse目录中的内容,对crawldb进行更新,增加新的URL,更换旧的URL。
进一步的两个处理流程
---------------------------
Nutch工作流程:index过程分析
index过程,即索引过程,包括:将数据转换成文本、分析文本、将分析过的文本保存到数据库中这三个操作。
(1) 转换成文本
在
索引数据之前,首先必须将数据转换成nutch 能够处理的格式――纯文本字符流。但是,在现实世界中,信息多以
富媒体(rich
media)文档格式呈现:PDF、WORD、EXCEL、HTML、XML等。为此,nutch采用了插件机制(plugin),
通过各种各样的文档解
析器,将富媒体转换成纯文字字符流。文档解析器种类繁多,开发人员可以根据需要进行选择,
同时还可以自己修改或编写,非常灵活方便。
(2) 分析文本
在
对数据进行索引前,还需要进行预处理,对数据进行分析使之更加适合被索引。分析数据时,先将文本数据切分成
一些大块或者语汇单元
(tokens),然后对它们执行一些可选的操作,例如:在索引之前将这些语汇单元转换成小写,
使得搜索对大小写不敏感;最有代表性的是要从输入中去掉一
些使用很频繁但却没有实际意义的词,比如英文文本中
的一些停止词(a、an、the、in、on等)。同样的,我们也需要分析输入的语汇单元,以便从词语
中去掉一些不必要的
字母以找到它们的词干。这一处理过程称为分析(analyze)。分析技术在索引和搜索时都会用到,比较重要。
(3) 将分析过的文本保存到数据库中
对输入的数据分析处理完成之后,就可以将结果写入到索引文件中。Nutch采用的是Lucene的索引格式,可以参考关于
Lucene的索引机制。Lucene采用“倒排索引”的数据结果来存储索引的。
Nutch工作流程:搜索程序分析
Nutch的搜索程序执行过程,可以从下面的步骤了解:
(1) HTTP服务器接收用户发送过来的请求。对应到nutch的运行代码中就是一个servlet,称为查询处理器(Query Handler)。
查询处理器负责响应用户的请求,并将相应的HTML结果页面返回给用户。
(2)
查询处理器对查询语句做一些微小的处理并将搜索的项(terms)转发到一组运行索引搜索器的机器上。Nutch的查询系统
似乎比lucene简单的多,
这主要是因为搜索引擎的用户对他自己所要执行的查询内容有非常清晰的思路。然而,lucene的
系统结构非常灵活,且提供了多种不同的查询方式。看似简单
的nutch查询最终被转换为特定的lucene查询类型。每个索引
搜索器并行工作且返回一组有序的文档ID列表。
(3) 现在存在这大量从查询处理器返回过来的搜索结果数据流。查询处理器对这些结果集进行比较,从所有的结果查找出匹配
最好的那些。如果其中任何一个索引搜索器在1~2秒之后返回结果失败,该搜索器的结果将被忽略。因此,最后列表由操作
成功的搜索器返回的结果组成。