KazMuzik.net
Music / Technology / Healthcare / Immigration / アメリカ
Google
 
<< LiveJournalEntryFilterReader - Kaz Muzik Blog Backup Project #9music & computer ... >>

LiveJournalEntryExtractor - Kaz Muzik Blog Backup Project #10 - KazMuzik Blog
2007-04-29 10:45

4/27 に nutch.protocol.Content クラスの main() メソッドをデバッグして、hadoop.io.SequnceFile.Reader を使うように修正しましたが、今回はその main() メソッドをアップデートして、昨日の LiveJournalEntryFilterReader を使い、Nutch segment のすべてのエントリだけを抜き出してまとめるクラスを実装しました。(*)
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ByteArrayInputStream;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.SequenceFile;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.UTF8;
import org.apache.nutch.util.NutchConfiguration;
import org.apache.nutch.protocol.Content;

public final class LiveJournalEntryExtractor {

  public static void main(String argv[]) throws Exception {
    String usage = "LiveJournalEntryExtractor segment";
    if (argv.length < 1) {
      System.out.println("usage:" + usage);
      return;
    }
    Configuration conf = NutchConfiguration.create();
    FileSystem fs = FileSystem.get(conf);
    String segment = argv[0];
    try {
      Path file = new Path(segment, Content.DIR_NAME + "/part-00000/data");
      SequenceFile.Reader contents = new SequenceFile.Reader(fs, file, conf);

      while (true) {
        Text key = new Text();
        Content content = new Content();
        if (! contents.next(key, content)) {
          break;
        }
        printEntries(key, content);
      }
      contents.close();
    } finally {
      fs.close();
    }
  }

  private static void printEntries(Text key, Content content)
                        throws IOException {
    System.out.println("<!-- " + key + " -->");
    LiveJournalEntryFilterReader in
      = new LiveJournalEntryFilterReader(
          new InputStreamReader(
            new ByteArrayInputStream(content.getContent()), "UTF-8"));
    while (true) {
      String line = in.readLine();
      if (line == null) {
        break;
      }
      System.out.println(line);
    }
  }
}

実行する前に、4/21 に fetch してからのエントリもあるので、それらを fetch して、以前の segment と merge しておきます。新しいエントリを fetch してくるところまで手順は前回と同じです。
$ cat urls-kazmuzikblog
http://kazuomik.livejournal.com/
$ cat conf/crawl-urlfilter.txt
+^http://kazuomik.livejournal.com/$
+^http://kazuomik.livejournal.com/[1-9][0-9]*.html$
-.
$ bin/nutch crawl urls-kazmuzikblog -dir tmp1 -depth 1
...
$ bin/nutch readseg -list -dir tmp1/segments
NAME            GENERATED  FETCHER START        FETCHER END          FETCHED  PARSED
20070429075944  1          2007-04-29T07:59:51  2007-04-29T07:59:51  1        1
$ bin/nutch readseg -dump tmp1/segments/20070429075944 tmp2
$ grep '<a name="item' tmp2/dump | grep '"></a>$' | \
  sed 's/^.*item//' | sed 's/\".*$//' | sort -n > tmp3.txt
$ cat tmp3.txt | sed 's/^/http:\/\/kazuomik.livejournal.com\//' | \
  sed 's/$/.html/' > urls-kazmuzikblog/nutch
$ vi conf/crawl-urlfilter.txt
+^http://kazuomik.livejournal.com/[1-9][0-9]*.html$
-.
$ bin/nutch crawl urls-kazmuzikblog -dir tmp4 -depth 1
...
$ bin/nutch readseg -list -dir tmp4/segments
NAME            GENERATED  FETCHER START        FETCHER END          FETCHED PARSED
20070429094242  20         2007-04-29T09:42:47  2007-04-29T09:43:19  20      20
$ bin/nutch mergesegs tmp5 crawl-3/segments/20070421201803 tmp4/segments/20070429094242
Merging 2 segments to tmp5/20070429094840
...
$ bin/nutch readseg -list tmp5/20070429094840
NAME            GENERATED  FETCHER START        FETCHER END          FETCHED PARSED
20070429094840  304        2007-04-21T20:18:09  2007-04-29T09:43:19  304     304
$ mv tmp4/segments/20070429094242 crawl-3/segments
$ mv tmp5/20070429094840 crawl-3/segments
$ rm -rf tmp*
$ bin/nutch readseg -list -dir crawl-3/segments
NAME            GENERATED  FETCHER START        FETCHER END          FETCHED PARSED
20070429094840  304        2007-04-21T20:18:09  2007-04-29T09:43:19  304     304
20070421201803  291        2007-04-21T20:18:09  2007-04-21T20:25:27  291     291
20070429094242  20         2007-04-29T09:42:47  2007-04-29T09:43:19  20      20
$ 

nutch の mergesegs サブコマンドで複数の segment を merge してまとめることができます。今回は最新の 20 エントリを fetch して、以前の 291 エントリと merge した結果、304 エントリとなりました。重複している 7つのエントリは、あたらしいものが merge されます。

それでは、この merge された segment に、今回のプログラムを適用して、ひとつの HTML ファイルにまとめます。
$ javac -classpath .:nutch-0.9.jar:lib/hadoop-0.12.2-core.jar LiveJournalEntryExtractor.java
$ java -classpath .:nutch-0.9.jar:lib/hadoop-0.12.2-core.jar:
lib/commons-logging-1.0.4.jar:lib/log4j-1.2.13.jar LiveJournalEntryExtractor \
crawl-3/segments/2007042909484 > all.html
$




2008-03-04 update
(*) -> sampo nutch project - Kaz Muzik Blog Backup Project #32

Tags: computer_technology, programming