在抓取网页时,是否有办法在nutch中获取每个网页的html内容?
答案 0 :(得分:8)
是的,您可以实际导出已爬网段的内容。这不是直截了当的,但对我来说效果很好。首先,使用以下代码创建一个java项目:
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();
}
}
}
我建议使用Maven;添加以下依赖项:
<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>
并创建一个jar包(即NutchSegmentOutputParser.jar)
您需要在计算机上安装Hadoop。然后运行:
$/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
其中nutch-crawled-dir / 2012xxxxxxxxx /是您要从中提取内容的已爬网目录(它包含'segment'子目录),outdir是输出目录。输出文件名是从URI生成的,但是,斜杠替换为“ _ ”。
希望它有所帮助。
答案 1 :(得分:1)
试试这个:
public ParseResult filter(Content content, ParseResult parseResult, HTMLMetaTags
metaTags, DocumentFragment doc)
{
Parse parse = parseResult.get(content.getUrl());
LOG.info("parse.getText: " +parse.getText());
return parseResult;
}
然后查看hadoop.log
中的内容。
答案 2 :(得分:0)
它的超级基础。
public ParseResult getParse(Content content) {
LOG.info("getContent: " + new String(content.getContent()));
Content对象有一个方法getContent(),它返回一个字节数组。让Java用BA创建一个新的String(),你就得到了nutch提取的原始html。
我正在使用Nutch 1.9
这是org.apache.nutch.protocol.Content上的JavaDoc https://nutch.apache.org/apidocs/apidocs-1.2/org/apache/nutch/protocol/Content.html#getContent()
答案 3 :(得分:-2)
是的,有办法。查看cache.jsp以了解它如何显示缓存数据。