2

我设置 Nutch 的 db.fetch.interval.default 为 60000,这样我就可以每天爬行。如果我不这样做,它甚至不会在我第二天抓取时查看我的网站。但是当我第二天抓取时,它昨天获取的每个页面都会使用 200 响应代码获取,这表明它没有使用“If-Modified-Since”中的前一天的日期。它不应该跳过获取未更改的页面吗?有没有办法让它做到这一点?我注意到 Fetcher.java 中有一个 ProtocolStatus.NOT_MODIFIED,所以我认为它应该能够做到这一点,不是吗?

顺便说一句,这是从当前主干的 conf/nutch-default.xml 剪切和粘贴的:

<!-- web db properties -->

<property>
  <name>db.default.fetch.interval</name>
  <value>30</value>
  <description>(DEPRECATED) The default number of days between re-fetches of a page.
  </description>
</property>

<property>
  <name>db.fetch.interval.default</name>
  <value>2592000</value>
  <description>The default number of seconds between re-fetches of a page (30 days).
  </description>
</property>
4

2 回答 2

6

我发现了问题。这是 Nutch 中的一个错误。我已经通过电子邮件向 Nutch 开发人员列表发送了有关它的信息,但这是我的修复:

Index: src/plugin/protocol-http/src/java/org/apache/nutch/protocol/http/HttpResponse.java
===================================================================
--- src/plugin/protocol-http/src/java/org/apache/nutch/protocol/http/HttpResponse.java  (revision 802632)
+++ src/plugin/protocol-http/src/java/org/apache/nutch/protocol/http/HttpResponse.java  (working copy)
@@ -124,11 +124,15 @@
         reqStr.append("\r\n");
       }

-      reqStr.append("\r\n");
       if (datum.getModifiedTime() > 0) {
         reqStr.append("If-Modified-Since: " + HttpDateFormat.toString(datum.getModifiedTime()));
         reqStr.append("\r\n");
       }
+      else if (datum.getFetchTime() > 0) {
+          reqStr.append("If-Modified-Since: " + HttpDateFormat.toString(datum.getFetchTime()));
+          reqStr.append("\r\n");
+      }
+      reqStr.append("\r\n");     

       byte[] reqBytes= reqStr.toString().getBytes();

现在我在我应该看到的 Apache 日志中看到 304。

于 2009-08-10T21:04:05.707 回答
0

我认为您误用了选项名称-db.fetch.interval.default。它应该是。

db.default.fetch.interval

提取每个注入页面后的天数,下次应该提取它。默认为 30。

我刚刚阅读了最新版本的更改日志,发现如下

  1. NUTCH-61 - 支持自适应重新获取间隔和检测未修改的内容。(ab)

如果您没有安装最新版本,我建议您这样做。

另外,您是否使用 -adddays 选项进行爬网?

于 2009-08-09T21:13:39.220 回答