仅将Nutch限制为种子路径及其后续网页

问题描述

我已经设置了Nutch 2.x来抓取一些多语言域。我可以将Nutch限制为仅链接,而不能限制为子文件夹。例如,对于跟随种子,

https://www.bbc.com/urdu

我只想检索/ urdu中的URL,因为该网站还包含其他语言的网页。现在,如何配置或自定义Nutch来处理这些情况?

解决方法

Nutch没有任何默认配置可完成您的任务。

您可以调整许多流程,例如更改执行HTML解析和提取链接的插件代码(例如 parse-html,parse-tika ..等)。 (OR)更改“解析阶段映射器”代码。

(OR)

您可以在regex-urlfilter.txt中添加以下正则表达式(请注意在注入阶段禁用 Ulfilter ,因为输入的种子在URL路径中可能没有语言信息)。

-(?i).*?//.*?[/?].*?(?<=[/])(urdu)([/?.]|$).*

但是我更喜欢以下方式。

在Nutch 1.16 ..中,您可以自定义ParseOutputFormat中使用的ParseSegment代码。 Parse Reducer Phase 作为RecordWriter。

ParseOutputFormat中会发生什么?

如果您在RecordWriter Impl的 getRecordWriter方法中进行检查, 它基本上会获取给定页面上的所有 Outlinks ,并且仅选择 每页 db.max.outlinks.per.page 个URL,并使用OPIC scoring filter对其进行评分,并使用 必要的状态并将其保存到Nutch DB。 (注意:它也适用于很多 提取的页面上的过滤器,并根据您对其进行归一化 nutch-site conf默认值)

如果您在getRecordWriter中检查此特定代码行

Outlink[] links = parseData.getOutlinks(); // this returns the number of outlinks
replace the above code with some thing like this
Outlink[] links = filter(parseData.getOutlinks(),langValue); 

您可以编写自定义过滤器方法。并返回其路径中没有对应的langValue的所有页面。

langValue->您可以直接对该值进行硬编码(或) 您可以在nutch-site.xml中具有属性(例如allowed.lang.per.page),并在getConf方法中读取它,并在filter方法中使用它。

如果要允许多个langValues。 然后传递分隔的值,并在读取它们时将其拆分并相应地自定义过滤方法...

,

您可以编辑conf/regex-urlfilter.txt 文件。文件底部有一条注释,表示接受其他任何内容。 如果您将+.的显示位置更改为适合网址的正则表达式,则希望删除其他所有内容。例如,您可能想要: +.*\/urdu\/.*