nutch源代码阅读心得

原文地址http://www.javaeye.com/topic/570440

主要类分析:
一、 org.apache.nutch.crawl.Injector: 
    1,注入url.txt
    2,url标准化
    3,拦截url,进行正则校验(regex-urlfilter.txt)
    4,对符URL标准的url进行map对构造<url, CrawlDatum>,在构造过程中给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中读取<url, CrawlDatum>,将它放入相应的队列中,队列以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对<url,ParseText>解析内容、<url,ParseData>包含所有链接的分析后的结果 、<url,CrawlDatum>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里组装好后收集时是<url,doc>,最后在输出的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方法实现!


附带些参考资料:

目录结构,参考自《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合并后的完整索引

主要类分析:
一、 org.apache.nutch.crawl.Injector: 
    1,注入url.txt
    2,url标准化
    3,拦截url,进行正则校验(regex-urlfilter.txt)
    4,对符URL标准的url进行map对构造<url, CrawlDatum>,在构造过程中给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中读取<url, CrawlDatum>,将它放入相应的队列中,队列以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对<url,ParseText>解析内容、<url,ParseData>包含所有链接的分析后的结果 、<url,CrawlDatum>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里组装好后收集时是<url,doc>,最后在输出的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方法实现!


附带些参考资料:

目录结构,参考自《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合并后的完整索引
内容概要:本文主要介绍了一个基于Matlab实现的无人机空中通信仿真项目,旨在通过数值仿真手段研究无人机在空中作为通信节点时的通信性能、信号传播特性和网络拓扑行为。该仿真涵盖了无人机飞行轨迹建模、无线信道建模(如路径损耗、多普勒效应、阴影衰落等)、通信链路建立与中断判断、信号干扰分析以及网络性能评估(如吞吐量、延迟、连接可靠性等)。项目可能结合优化算法或智能控制策略,用于优化无人机位置部署或动态路径规划,以提升通信服务质量。整个仿真系统为研究人员提供了一套完整的工具链,用于验证新型无人机通信协议、协作机制和网络架构的有效性。; 适合人群:具备一定Matlab编程基础和通信原理基础知识,从事无人机、无线通信、网络优化等相关领域研究的研发人员和高校研究生。; 使用场景及目标:① 评估无人机作为空中基站或中继节点的通信覆盖能力和网络性能;② 设计和优化无人机集群的通信拓扑与协同策略;③ 验证新型无线资源分配、移动性管理和抗干扰算法在动态空地网络中的有效性。; 阅读建议:使用者应结合Matlab代码深入理解仿真模型的构建逻辑,重点关注通信信道模块和无人机运动学模型的耦合关系,并可根据实际研究需求,对仿真参数(如环境噪声、飞行速度、天线增益)进行调整,以开展针对性的对比实验和性能分析。
内容概要:本文围绕微电网中光伏发电系统经逆变器带负载的完整仿真模型展开研究,利用Simulink平台构建了从光伏阵列建模、DC-AC逆变器控制(包括PWM调制与电压电流双闭环控制)、并网策略到负载响应的全过程仿真系统。重点分析了系统在不同工况下的动态响应特性与电能质量表现,并对并网控制策略、最大功率点跟踪(MPPT)技术及系统稳定性进行了深入探讨和验证。该模型不仅可用于教学演示微电网的基本架构与运行机制,更为科研提供了可靠的仿真平台,支持对新型控制算法与系统优化方案的有效验证与评估。; 适合人群:具备一定电力电子技术、自动控制理论基础及Simulink/MATLAB操作经验的电气工程、自动化等相关专业的本科生、研究生及科研人员。; 使用场景及目标:①用于高校课程教学中微电网系统结构与运行原理的直观演示;②为科研工作者提供光伏发电并网系统的仿真验证平台,支持开展逆变器控制算法(如双闭环控制、MPPT)、系统稳定性分析及电能质量管理等关键技术的研究与优化。; 阅读建议:建议学习者结合Simulink仿真环境动手搭建模型,重点关注各功能模块间的信号传递关系与关键参数设置,并通过调整光照强度、温度、负载大小等外部条件,观察系统动态响应过程,从而深化对微电网运行特性的理解与掌握。
内容概要:本文围绕“多变量输入超前多步预测”的光伏功率预测问题,提出了一种基于CNN-BiLSTM混合深度学习模型的研究方法,并提供了完整的Matlab代码实现。该模型首先利用卷积神经网络(CNN)提取输入气象数据(如光照强度、温度、湿度等)中的局部关键特征,捕捉变量间的空间相关性;随后,通过双向长短期记忆网络(BiLSTM)充分挖掘时间序列数据中的长期依赖关系,既能利用历史信息,也能结合未来时刻的上下文信息,从而实现对未来多个时间步长的光伏功率进行高精度预测。研究重点在于处理多变量输入和满足超前多步预测的实际工程需求,有效提升了预测的准确性与鲁棒性。; 适合人群:具备一定机器学习和深度学习理论基础,熟悉Matlab编程,从事新能源发电预测、电力系统调度、时间序列分析等相关领域的研究人员和工程技术人员。; 使用场景及目标:① 解决光伏出力受多重气象因素影响的复杂非线性预测问题;② 实现未来一段时间(如未来24小时)的功率超前多步预测,为电网调度、储能管理和电力市场交易提供决策依据;③ 学习和复现先进的CNN与BiLSTM融合模型在能源预测领域的具体应用。; 阅读建议:使用者应重点关注模型的网络结构设计、多变量数据预处理流程以及多步预测的实现策略。建议结合提供的Matlab代码,自行准备或替换实际的光伏电站运行数据与气象数据,通过调整模型超参数(如卷积核大小、LSTM隐藏层维度、训练周期等)进行实验,以深入理解模型性能并将其应用于具体的科研或工程项目中。
内容概要:本文介绍了一种基于Simulink的光伏储能单相逆变器并网仿真模型,系统性地实现了光伏储能系统与电网之间的能量转换与并网控制全过程。该模型涵盖逆变器的PWM调制、并网同步控制、功率调节策略以及储能单元的能量管理机制,能够精确模拟光照强度变化、负载波动及电网扰动等多种实际运行工况下的系统动态响应特性。通过模块化建模方法,模型具备良好的可扩展性与灵活性,便于研究人员对并网电能质量、控制算法性能及系统稳定性进行深入分析与优化设计。; 适合人群:具备电力电子、新能源发电或自动控制等相关专业背景的本科高年级学生、研究生,以及从事光伏并网系统研发的工程技术人员。; 使用场景及目标:①作为教学工具,帮助学生理解光伏并网逆变器的工作原理与控制逻辑;②服务于科研项目,用于并网控制算法(如PI、PR、重复控制等)的设计、仿真验证与性能对比;③辅助完成毕业设计或工程项目中的系统仿真环节;④为实际工程应用提供前期仿真验证与技术预研支持。; 阅读建议:建议使用者在学习前巩固电力电子技术和可再生能源系统的基础理论,按照模型结构逐步搭建与调试;可利用文中提供的仿真框图和参数设置进行复现,并尝试引入不同工况(如光照突变、电网电压波动等)以评估系统的鲁棒性与适应性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值