Nutch urlfilter 正则表达式
Nutch urlflter regex
我似乎太笨了,无法正确排除正则表达式。我想过滤 URL 个域:http://0.gravatar.com/。我的正则表达式-urlfilter.txt 包含以下内容:
-http://0.gravatar.com(.*)
-^http://0.gravatar.com.[a-zA-Z0-9.\S]+$
但 URL 仍在处理中,这导致了错误:
java.lang.Exception: org.apache.solr.client.solrj.impl.HttpSolrClient$RemoteSolrException: Error from server at http://localhost:8983/solr/cdp: Server error writing document id http://0.gravatar.com/.. to the index
at org.apache.hadoop.mapred.LocalJobRunner$Job.runTasks(LocalJobRunner.java:491)
at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:558)
Caused by: org.apache.solr.client.solrj.impl.HttpSolrClient$RemoteSolrException: Error from server at http://localhost:8983/solr/cdp: Server error writing document id http://0.gravatar.com/.. to the index
at org.apache.solr.client.solrj.impl.HttpSolrClient.executeMethod(HttpSolrClient.java:643)
at org.apache.solr.client.solrj.impl.HttpSolrClient.request(HttpSolrClient.java:255)
at org.apache.solr.client.solrj.impl.HttpSolrClient.request(HttpSolrClient.java:244)
at org.apache.solr.client.solrj.SolrClient.request(SolrClient.java:1219)
at org.apache.nutch.indexwriter.solr.SolrIndexWriter.push(SolrIndexWriter.java:247)
at org.apache.nutch.indexwriter.solr.SolrIndexWriter.commit(SolrIndexWriter.java:214)
at org.apache.nutch.indexer.IndexWriters.commit(IndexWriters.java:264)
at org.apache.nutch.indexer.IndexerOutputFormat.close(IndexerOutputFormat.java:54)
at org.apache.hadoop.mapred.ReduceTask$NewTrackingRecordWriter.close(ReduceTask.java:550)
at org.apache.hadoop.mapred.ReduceTask.runNewReducer(ReduceTask.java:629)
at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:389)
at org.apache.hadoop.mapred.LocalJobRunner$Job$ReduceTaskRunnable.run(LocalJobRunner.java:346)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:834)
所以或者:我可以修改代码以便捕获错误并简单地跳过解析的 URL 内容。或者是否有设置跳过而不是失败?
更新:感谢您的回复,但它并没有改变爬虫的行为。我已将 -^https?://0\.gravatar\.com and -^https?://1\.gravatar\.com
放在正则表达式-urlfilter.txt 的顶部。但是带有 0.gravatar.com 和 1.gravatar.com 的 URL 仍在被获取、解析和索引。这仍然会导致上面相同的错误消息。难道那些 URL 已经被注入并且没有被 url-过滤器再次检查?
我找到了这个问题的描述:https://lucene.472066.n3.nabble.com/regex-urlfilter-test-shows-negative-but-URL-still-crawled-td4081480.html 并且我发现关于浪费 CPU 的答案是明智的。所以我更愿意在发生索引错误时跳过文档。
此规则应排除 0.gravatar.com
中的所有 URL。
-^https?://0\.gravatar\.com
不需要通过给定的正则表达式匹配整个 URL。每行必须包含一个规则。请注意,还有其他 URL 过滤器(前缀、域)更易于用于此类排除。
我终于明白了。这是一整串错误,但根本原因是 Solr 缺少 Heap Space。使用 solr.cmd start -m 4g
启动 Solr 解决了这个问题。我永远不会猜到这一点,因为我在数百万页的索引中进行了数周的爬行。但似乎索引失败不是在某个 URL 而是在索引过程的某个阶段。整个 URL 任务只是一个前奏。一旦我明白了,注入的 URLs 不会再次测试,我需要删除 -noFilter 标志(请参阅我的更新中的 link),很明显错误通过 URL 传播s 和错误需要在其他地方。考虑到我的爬行阶段,这再次令人惊讶。
我似乎太笨了,无法正确排除正则表达式。我想过滤 URL 个域:http://0.gravatar.com/。我的正则表达式-urlfilter.txt 包含以下内容:
-http://0.gravatar.com(.*) -^http://0.gravatar.com.[a-zA-Z0-9.\S]+$
但 URL 仍在处理中,这导致了错误:
java.lang.Exception: org.apache.solr.client.solrj.impl.HttpSolrClient$RemoteSolrException: Error from server at http://localhost:8983/solr/cdp: Server error writing document id http://0.gravatar.com/.. to the index
at org.apache.hadoop.mapred.LocalJobRunner$Job.runTasks(LocalJobRunner.java:491)
at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:558)
Caused by: org.apache.solr.client.solrj.impl.HttpSolrClient$RemoteSolrException: Error from server at http://localhost:8983/solr/cdp: Server error writing document id http://0.gravatar.com/.. to the index
at org.apache.solr.client.solrj.impl.HttpSolrClient.executeMethod(HttpSolrClient.java:643)
at org.apache.solr.client.solrj.impl.HttpSolrClient.request(HttpSolrClient.java:255)
at org.apache.solr.client.solrj.impl.HttpSolrClient.request(HttpSolrClient.java:244)
at org.apache.solr.client.solrj.SolrClient.request(SolrClient.java:1219)
at org.apache.nutch.indexwriter.solr.SolrIndexWriter.push(SolrIndexWriter.java:247)
at org.apache.nutch.indexwriter.solr.SolrIndexWriter.commit(SolrIndexWriter.java:214)
at org.apache.nutch.indexer.IndexWriters.commit(IndexWriters.java:264)
at org.apache.nutch.indexer.IndexerOutputFormat.close(IndexerOutputFormat.java:54)
at org.apache.hadoop.mapred.ReduceTask$NewTrackingRecordWriter.close(ReduceTask.java:550)
at org.apache.hadoop.mapred.ReduceTask.runNewReducer(ReduceTask.java:629)
at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:389)
at org.apache.hadoop.mapred.LocalJobRunner$Job$ReduceTaskRunnable.run(LocalJobRunner.java:346)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:834)
所以或者:我可以修改代码以便捕获错误并简单地跳过解析的 URL 内容。或者是否有设置跳过而不是失败?
更新:感谢您的回复,但它并没有改变爬虫的行为。我已将 -^https?://0\.gravatar\.com and -^https?://1\.gravatar\.com
放在正则表达式-urlfilter.txt 的顶部。但是带有 0.gravatar.com 和 1.gravatar.com 的 URL 仍在被获取、解析和索引。这仍然会导致上面相同的错误消息。难道那些 URL 已经被注入并且没有被 url-过滤器再次检查?
我找到了这个问题的描述:https://lucene.472066.n3.nabble.com/regex-urlfilter-test-shows-negative-but-URL-still-crawled-td4081480.html 并且我发现关于浪费 CPU 的答案是明智的。所以我更愿意在发生索引错误时跳过文档。
此规则应排除 0.gravatar.com
中的所有 URL。
-^https?://0\.gravatar\.com
不需要通过给定的正则表达式匹配整个 URL。每行必须包含一个规则。请注意,还有其他 URL 过滤器(前缀、域)更易于用于此类排除。
我终于明白了。这是一整串错误,但根本原因是 Solr 缺少 Heap Space。使用 solr.cmd start -m 4g
启动 Solr 解决了这个问题。我永远不会猜到这一点,因为我在数百万页的索引中进行了数周的爬行。但似乎索引失败不是在某个 URL 而是在索引过程的某个阶段。整个 URL 任务只是一个前奏。一旦我明白了,注入的 URLs 不会再次测试,我需要删除 -noFilter 标志(请参阅我的更新中的 link),很明显错误通过 URL 传播s 和错误需要在其他地方。考虑到我的爬行阶段,这再次令人惊讶。