至少有一些解決方案。
1)urlfilter正則表達式插件
如果您不想爬網的是非www網頁,在所有的,否則在後面的階段進行篩選,如在索引時間,這正是urlfilter -regex插件是爲。它可以讓你標記任何匹配以「+」開頭的正則表達式模式的URL。任何不匹配以「+」開頭的正則表達式都不會被抓取。此外,如果您想指定一般模式但排除某些網址,則可以使用「 - 」前綴來指定隨後排除的網址。
你的情況,你可以使用如下規則:
+^(https?://)?www\.
這將匹配任何開頭:
https://www.
http://www.
www.
,因此將只允許抓取此類URL。
基於這樣一個事實,即列出的URL在給定regex-urlfilter時並未被排除,這意味着插件未在nutch-site.xml中打開,否則它不會指向該文件。
在Nutch的-site.xml中你必須在插件列表中指定的正則表達式,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%20solrdedup
這將使用從每個索引頁面的文本計算出的摘要值來查找任何相同的頁面並刪除除一個之外的所有頁面。
但是,如果您想特別保留「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
我試圖用選項1運行,我使用正則表達式建議只解釋WWW的改變,但是當我爬那麼索引到Solr ,我仍然可以獲得www和非www結果。我確認插件確實已添加到nutch站點,並且未被默認的nutch文件覆蓋。也就是說,我確實看到日誌文件只抓取www,而之前的日誌文件抓取了這兩個文件。 然後我試着運行刪除重複每個選項2的建議,但仍然是相同的結果。 我需要從Nutch或Solr的其他地方刪除嗎? – markreyes
如果我想特別保留「www」的那個,我將如何修改插件以更改保留的副本? – markreyes
在您再次抓取或至少清除該集合之前,您是否清除了Solr中的所有內容?我猜測舊的爬網頁仍然存在 - 即使它現在只能正確爬取www頁面。您可以向該核心的Solr發送刪除請求:「solr_url/core_name/update?stream.body =%3Cdelete%3E%3Cquery%3E *:*%3C/query%3E%3C/delete%3E&commit = true」( *注意,這將刪除該核心中的每個文檔) – Brian