我是搜索引擎和网络爬虫的新手。现在,我希望将特定网站中的所有原始页面存储为html文件,但使用Apache Nutch只能获得二进制数据库文件。如何使用Nutch获取原始html文件?
Nutch支持它吗?如果没有,我可以使用哪些其他工具来实现我的目标。(支持分布式爬行的工具更好。)
发布于 2012-04-08 11:30:27
nutch会把抓取的数据写成二进制格式,所以如果你想把它保存成html格式,你必须修改代码。(如果您是nutch新手,这将是痛苦的)。
如果您希望快速轻松地获取html页面,请执行以下操作:
wget
的脚本来完成。编辑:
写一个你自己的nutch插件会很棒。你的问题将得到解决,另外你可以通过提交你的作品来为nutch做出贡献!如果你是nutch的新手(在代码和设计方面),那么你将不得不投入大量时间来构建一个新的插件……否则就很容易做到。
对你的计划有帮助的几点建议:
Here是一个谈论编写自己的nutch插件的页面。
从Fetcher.java开始。参见第647-648行。这是一个地方,在这里你可以获取基于每个url的获取内容(对于那些成功获取的页面)。
pstatus = output(fit.url, fit.datum, content, status, CrawlDatum.STATUS_FETCH_SUCCESS);
updateStatus(content.getContent().length);
你应该在这之后添加代码来调用你的插件。将content
对象传递给它。到目前为止,你可能已经猜到content.getContent()
是你想要的url的内容。在插件代码中,将其写入某个文件。文件名应该基于url名称,否则将很难使用它。Url可以通过fit.url
获取。
发布于 2012-04-20 19:01:57
您必须在run in 中进行修改。
当您能够运行时,打开Fetcher.java并在"content saver“命令行之间添加行。
case ProtocolStatus.SUCCESS: // got a page
pstatus = output(fit.url, fit.datum, content, status, CrawlDatum.STATUS_FETCH_SUCCESS, fit.outlinkDepth);
updateStatus(content.getContent().length);'
//------------------------------------------- content saver ---------------------------------------------\\
String filename = "savedsites//" + content.getUrl().replace('/', '-');
File file = new File(filename);
file.getParentFile().mkdirs();
boolean exist = file.createNewFile();
if (!exist) {
System.out.println("File exists.");
} else {
FileWriter fstream = new FileWriter(file);
BufferedWriter out = new BufferedWriter(fstream);
out.write(content.toString().substring(content.toString().indexOf("<!DOCTYPE html")));
out.close();
System.out.println("File created successfully.");
}
//------------------------------------------- content saver ---------------------------------------------\\
发布于 2013-10-09 22:16:23
要更新此答案,请-
可以对crawldb segment文件夹中的数据进行后期处理,并直接读取html (包括nutch存储的其他数据)。
Configuration conf = NutchConfiguration.create();
FileSystem fs = FileSystem.get(conf);
Path file = new Path(segment, Content.DIR_NAME + "/part-00000/data");
SequenceFile.Reader reader = new SequenceFile.Reader(fs, file, conf);
try
{
Text key = new Text();
Content content = new Content();
while (reader.next(key, content))
{
System.out.println(new String(content.GetContent()));
}
}
catch (Exception e)
{
}
https://stackoverflow.com/questions/10007178
复制相似问题