转 nutch源代码阅读心得

简介:

一、 org.apache.nutch.crawl.Injector

  1. 注入url.txt

  2. url标准化

  3. 拦截url,进行正则校验(regex-urlfilter.txt)

  4. 对符合URL标准的url进行map对构造,在构造过程中给CrawlDatum初始化得分,分数可影响url host的搜索排序和采集优先级!

  5. reduce只做一件事,判断url是不是在crawldb中已经存在,如果存在则直接读取原来CrawlDatum,如果是新host,则把相应状态存储到里边(STATUS_DB_UNFETCHED(状态意思为没有采集过))

二、org.apache.nutch.crawl.Generator

  1. 过滤不及格url (使用url过滤插件)

  2. 检测URL是否在有效更新时间里

  3. 获取URL metaData,metaData记录了url上次更新时间

  4. 对url进行打分

  5. 将url载入相应任务组(以host为分组)

  6. 计算url hash值

  7. 收集url, 直至到达 topN 指定量

三、 org.apache.nutch.crawl.Fetcher:

  1. 从segment中读取,将它放入相应的队列中,队列以queueId为分类,而queueId是由 协议://ip 组成,在放入队列过程中,如果不存在队列则创建(比如javaeye的所有地址都属于这个队列:http://221.130.184.141)  --> queues.addFetchItem(url, datum);

  2. 检查机器人协议是否允许该url被爬行(robots.txt) --> protocol.getRobotRules(fit.url, fit.datum);

  3. 检查url是否在有效的更新时间里 --> if (rules.getCrawlDelay() > 0) 

  4. 针对不同协议采用不同的协议采用不同机器人,可以是http、ftp、file,这地方已经将内容保存下来(Content)。 --> protocol.getProtocolOutput(fit.url, fit.datum);

  5. 成功取回Content后,再次对HTTP状态进行识别(如200、404)。--> case ProtocolStatus.SUCCESS: 

  6. 内容成功保存,进入ProtocolStatus.SUCCESS区域,在这区域里,系统对输出内容进行构造。 --> output(fit.url, fit.datum, content, status, CrawlDatum.STATUS_FETCH_SUCCESS);

  7. 在内容构造过程中,调取内容解析器插件(parseUtil),如mp3\html\pdf\word\zip\jsp\swf……。 --> this.parseUtil.parse(content); --> parsers[i].getParse(content);

  8. html解析,所以只简略说明HtmlParser,HtmlParser中,会解析出text,title, outlinks, metadata。  

    text:过滤所有HTML元素;title:网页标题;outlinks:url下的所有链接;metadata:这东西分别做那么几件事情 首先检测url头部的meta name="robots" 看看是否允许蜘蛛爬行,

    其次通过对meta http-equiv refresh等属性进行识别记录,看页面是否需要转向。

四、 org.apache.nutch.parse.ParseSegment: 

    1,这个类逻辑就相对简单很多了哦,它对我们也是很有价值的,它只做一件事情,就是对爬行下来的Content(原始HTML)进行解析,具体解析通过插 件来实现。

        比如我们要做的数据分析、数据统计都可以在这进行实现。

    2,执行完成后,输出三个Map对解析内容、包含所有链接的分析 后的结果 、outlinks


五、org.apache.nutch.crawl.CrawlDb: 

    主要根据crawld_fatch输出更新crawldb。

    1,map对crawld_fatch、crawldb地址进行标准化(nomalizer)和拦截操作(filte);

    2,reduce在对两crawld_fatch和crawldb进行合并更新。


六、org.apache.nutch.crawl.LinkDb: 

    这个类的作用是管理新转化进来的链接映射,并列出每个url的外部链接(incoming links)。

    1,先是对每一个url取出它的outLinks,作map操作把这个url作为每个outLinks的incoming link,

    2,在reduce里把根据每个key来把一个url的所有incoming link都加到inlinks里。

    3,这样就把每个url的外部链接统计出来了,注意,系统对只对外部链接进行统计,什么叫外部链接呢,就是只对不同host进行统计,

        记住javaeye.com和biaowen.javaeye.com是两个不同的host哦。 --> boolean ignoreInternalLinks = true;

    4,然后一步是对这些新加进来的链接进行合并。


七、 org.apache.nutch.crawl.Indexer: 

    这个类的任务是另一方面的工作了,它是基于hadoop和lucene的分布式索引。它就是为前面爬虫抓取回来的数据进行索引好让用户可以搜索到这些数 据。

    这里的输入就比较多了,有segments下的fetch_dir,parseData和parseText,还有crawldb下的 current_dir和linkdb下的current_dir。

    1,在这个类里,map将所有输入都装载到一个容器里边,

    2,再到reduce进行分类处理,

    3,实现拦截 --> this.filters.filter(doc, parse, key, fetchDatum, inlinks);

    4,打分 --> this.scfilters.indexerScore(key, doc, dbDatum,fetchDatum, parse, inlinks, boost);

    5,当然要把这些数据体组合成一个 lucene的document让它索引了。

    6,在reduce里组装好后收集时是,最后在输出的OutputFormat类 里进行真正的索引。

        doc里有如下几个field

            content(正文)

            site    (所属主地址)

            title    (标题)

            host    (host)

            segement    (属于哪个segement)

            digest    (MD5码,去重时候用到)

            tstamp    (时间戳)

            url    (当前URL地址)

            载了一个例子:

                doc = 

                    {content=[biaowen - JavaEye技术网站 首页 新闻 论坛 博客 招聘 更多 ▼ 问答 ………………(内容省略)………… biaowen 永NF/ICP备05023328号], 

                    site=[biaowen.javaeye.com], 

                    title=[biaowen - JavaEye技术网站], 

                    host=[biaowen.javaeye.com], 

                    segment=[20090725083125], 

                    digest=[063ba8430fa84e614ce71276e176f4ce], 

                    tstamp=[20090725003318265], 

                    url=[http://biaowen.javaeye.com/]}


八、 org.apache.nutch.crawl.DeleteDuplicates: 

    这个类的作用就是这它的名字所写的意思--去重。

    前面索引后(当然不是一次时的情况)会有重复,所以要去重。为什么呢,在一次索引时是不重复的,可是多次抓取后就会有重复了。

    就是这个原因才要去重。当然去重的规则有两种一个是以时间为标准,一种是以内容的md5值为标准。


九、org.apache.nutch.indexer.IndexMerger: 

    这个类就相对简单了,目的将多个indexes合并为一个index,直接调用lucene方法实现!



附带些参考资料:

contentcrawl_fetchcrawl_generatecrawl_parseparse_dataparse_text。其中content是抓取下来的网页内容;crawl_generate最初生成;crawl_fetchcontent在抓取时生成;crawl_parseparse_dataparse_text在解析抓取的数据文件时生成。其中crawl_generatecrawl_fetchcrawl_parsecrawldb的部分url数据,它们格式一样,不同的是抓取时间、状态、签名等有所变化


目录结构,参考自《Lucene+Nutch搜索引擎开发》

    一、crawldb    下载的url,以及下载日期,用来进行页面更新

    二、segements    存放抓取页面和分析结果

                        1、crawl_generate:待下载url

                        2、crawl_fetch:每个下载url的状态

                        3、content:每个下载页面的内容

                        4、parse_text:包含每个解析过的url文本内容

                        5、parse_data:每个url解析出的外部链接和元数据

                        6、crawl_parse:用来更新crawl的外部链接库

    三、linkdb    存放url的互联关系

    四、indexes:存放每次下载的独立索引目录

    五、index:符合lucene格式的索引目录,是indexes里所有index合并后的完整索引


目录
相关文章
|
缓存 Kubernetes 开发者
Gitlab Runner的分布式缓存实战
配置兼容S3的分布式缓存minio,在k8s环境支持Gitlab CI脚本的缓存语法
369 1
Gitlab Runner的分布式缓存实战
|
IDE Java Maven
idea2020版Maven依赖成功导入但仍然报错找不到包解决
idea2020版Maven依赖成功导入但仍然报错找不到包解决
1967 0
idea2020版Maven依赖成功导入但仍然报错找不到包解决
|
12月前
|
数据处理 Python
熵值法计算权重
熵值法计算权重是一种基于信息论的方法,用于多指标综合评价。通过计算各指标的信息熵,反映指标的变异程度,从而确定其在综合评价中的权重。熵值越小,表示信息量越大,指标的重要性越高。该方法适用于样本数据较少的情形,能有效避免主观因素的影响。文中详细介绍了熵值法的原理、计算步骤及Python实现代码。
2114 1
|
人工智能 搜索推荐 API
用于企业AI搜索的Bocha Web Search API,给LLM提供联网搜索能力和长文本上下文
博查Web Search API是由博查提供的企业级互联网网页搜索API接口,允许开发者通过编程访问博查搜索引擎的搜索结果和相关信息,实现在应用程序或网站中集成搜索功能。该API支持近亿级网页内容搜索,适用于各类AI应用、RAG应用和AI Agent智能体的开发,解决数据安全、价格高昂和内容合规等问题。通过注册博查开发者账户、获取API KEY并调用API,开发者可以轻松集成搜索功能。
|
NoSQL Java 数据库
neo4j图数据库下载安装配置
neo4j图数据库下载安装配置
|
存储 安全 数据库连接
搭建个人云存储解决方案:从零到一
【5月更文挑战第18天】本文指导读者搭建个人云存储解决方案,从选择Nextcloud等开源软件到准备服务器和存储设备,再到安装配置、上传管理文件,强调安全性及扩展性。通过本文,读者可掌握搭建个人云存储的步骤,确保数据安全并享受便捷访问。
1454 3
|
消息中间件 RocketMQ
RocketMQ - 消费者进度保存机制
RocketMQ - 消费者进度保存机制
248 0
|
Linux 数据处理
探索Linux下的readlink命令:解析符号链接的利器
`readlink`命令在Linux中用于揭示符号链接的指向,显示它们所链接的实际文件或目录的路径。它可以显示简洁的绝对路径(-f),处理循环链接(-e),或不加换行符输出(-n)。例如,查看`link.txt`指向:`readlink link.txt`;获取绝对路径:`readlink -f link.txt`。使用时要注意链接是否存在、权限问题和可能的循环链接。
|
运维 搜索推荐 调度
Ha3搜索引擎简介
Ha3是阿里巴巴搜索团队开发的搜索引擎平台,它为阿里集团包括淘宝、天猫在内的核心业务提供搜索服务支持。
24694 1
|
Java Maven
ivy 配置 maven代理
Ivy 是一个依赖管理工具,直观感受是其跟maven 的作用差不多;但这两个其实是不同的工具: maven 是面向整个项目的工程管理及构建工具;ivy 仅作为依赖管理工具,与ant 高度集成。 需要了解更多不同,可看看这里:http://ant.apache.org/ivy/m2comparison.html   几年前了解到这东西,也是因为 play! 框架内置的依赖使用它进行依赖管理,但至今国内仍然以maven 作为主流依赖管理工具,看来还是先入为主的问题。
3213 0