至少有几个解决方案。
1.) urlfilter-regex 插件
如果您根本不想抓取非 www 页面,或者在稍后阶段(例如在索引时)过滤它们,这就是 urlfilter-regex 插件的用途。它使您可以标记任何与以“+”开头的正则表达式模式匹配的 URL 以进行爬网。任何不匹配以“+”为前缀的正则表达式的内容都不会被抓取。此外,如果您想指定通用模式但排除某些 URL,您可以使用“-”前缀指定随后要排除的 URL。
在您的情况下,您将使用如下规则:
+^(https?://)?www\.
这将匹配以以下开头的任何内容:
https://www.
http://www.
www.
因此只允许抓取此类 URL。
基于您的 regex-urlfilter 中列出的 URL 尚未被排除的事实,这意味着插件未在您的 nutch-site.xml 中打开,或者它未指向该文件。
在 nutch-site.xml 中,您必须在插件列表中指定 regex-urlfilter,例如:
<property>
<name>plugin.includes</name>
<value>protocol-httpclient|urlfilter-regex|parse-(html|tika)|index-basic|query-(basic|site|url)|response-(json|xml)|urlnormalizer-(pass|regex|basic)</value>
</property>
另外检查指定使用哪个文件的属性在 nutch-site.xml 中没有被覆盖,并且在 nutch-default.xml 中是正确的。它应该是:
<property>
<name>urlfilter.regex.file</name>
<value>regex-urlfilter.txt</value>
<description>Name of file on CLASSPATH containing regular expressions
used by urlfilter-regex (RegexURLFilter) plugin.</description>
</property>
并且 regex-urlfilter.txt 应该在 nutch 的 conf 目录中。
如果您只想过滤比,还可以选择仅在不同步骤(例如索引时间)执行过滤。
2.) solrdedup 命令
如果 URL 指向完全相同的页面,我猜这里就是这种情况,则可以通过运行 nutch 命令在抓取后删除重复项来删除它们:
http ://wiki.apache.org/nutch/bin/nutch% 20solrdup
这将使用从每个索引页面的文本计算的摘要值来查找任何相同的页面并删除除一个之外的所有页面。
但是,如果您想专门保留“www”,则必须修改插件以更改保留的副本。
3.) 编写自定义索引过滤器插件
您可以编写一个插件来读取 nutch 文档的 URL 字段,并在索引之前以您想要的任何方式对其进行转换。这将比使用现有的插件(如 urlnormalize-regex)更灵活。
制作插件并将它们添加到 Nutch 中实际上非常容易,这是它的一大优点。作为起点,您可以复制并查看其他插件之一,包括实现 IndexingFilter 的带有 nutch 的插件,例如 index-basic 插件。
您还可以找到很多示例:
http ://wiki.apache.org/nutch/WritingPluginExample
http://sujitpal.blogspot.com/2009/07/nutch-custom-plugin-to-parse-and-add。 html