Yes, you can export the contents of bypass segments. It is not easy, but it works well for me. First create a java project with the following code:
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.nutch.protocol.Content; import org.apache.nutch.util.NutchConfiguration; import java.io.File; import java.io.FileOutputStream; public class NutchSegmentOutputParser { public static void main(String[] args) { if (args.length != 2) { System.out.println("usage: segmentdir (-local | -dfs <namenode:port>) outputdir"); return; } try { Configuration conf = NutchConfiguration.create(); FileSystem fs = FileSystem.get(conf); String segment = args[0]; File outDir = new File(args[1]); if (!outDir.exists()) { if (outDir.mkdir()) { System.out.println("Creating output dir " + outDir.getAbsolutePath()); } } Path file = new Path(segment, Content.DIR_NAME + "/part-00000/data"); SequenceFile.Reader reader = new SequenceFile.Reader(fs, file, conf); Text key = new Text(); Content content = new Content(); while (reader.next(key, content)) { String filename = key.toString().replaceFirst("http://", "").replaceAll("/", "___").trim(); File f = new File(outDir.getCanonicalPath() + "/" + filename); FileOutputStream fos = new FileOutputStream(f); fos.write(content.getContent()); fos.close(); System.out.println(f.getAbsolutePath()); } reader.close(); fs.close(); } catch (Exception e) { e.printStackTrace(); } }
}
I recommend using Maven; add the following dependencies:
<dependency> <groupId>org.apache.nutch</groupId> <artifactId>nutch</artifactId> <version>1.5.1</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>0.23.1</version> </dependency>
and create a jar package (i.e. NutchSegmentOutputParser.jar)
You need to install Hadoop on your computer. Then run:
$/hadoop-dir/bin/hadoop --config \ NutchSegmentOutputParser.jar:~/.m2/repository/org/apache/nutch/nutch/1.5.1/nutch-1.5.1.jar \ NutchSegmentOutputParser nutch-crawled-dir/2012xxxxxxxxx/ outdir
where nutch-crawled-dir / 2012xxxxxxxxx / is the bypass directory from which you want to extract the content (it contains the "segment" subdirectory), and outdir is the output directory. Output file names are generated from the URI, but slashes are replaced with "_".
Hope this helps.
Habi
source share