我是新的搜索引擎和网络爬虫。现在我想将所有原始页面作为html文件存储在特定网站中,但使用Apache Nutch,我只能获取二进制数据库文件。我如何使用Nutch获取原始html文件?如何保存原点HTML文件与Apache的Nutch
是否Nutch的支持呢?如果没有,我可以用什么样的工具来实现我的目标。(支持分布式抓取工具更好。)
我是新的搜索引擎和网络爬虫。现在我想将所有原始页面作为html文件存储在特定网站中,但使用Apache Nutch,我只能获取二进制数据库文件。我如何使用Nutch获取原始html文件?如何保存原点HTML文件与Apache的Nutch
是否Nutch的支持呢?如果没有,我可以用什么样的工具来实现我的目标。(支持分布式抓取工具更好。)
好,Nutch的会写以二进制形式抓取的数据,所以如果你想,要保存在html格式,你将不得不修改代码。 (如果你是新手,这会很痛苦)。
如果你想要得到的HTML页面快速和简单的解决方案:
wget
脚本完成的URL列表每个网址。编辑:
写你自己的Nutch的插件将是巨大的。你的问题将得到解决,你可以通过提交你的作品来贡献给nutch!如果你是nutch的新手(根据代码&设计),那么你将不得不投入大量的时间来构建一个新的插件......否则它很容易做到。
帮助您主动几个要点:
Here是在谈论自己编写插件Nutch的页面。
开始Fetcher.java。见行647-648。这是您可以根据网址获取获取内容的地方(对于获取成功的页面)。
pstatus = output(fit.url, fit.datum, content, status, CrawlDatum.STATUS_FETCH_SUCCESS);
updateStatus(content.getContent().length);
您应该在此之后添加代码以调用您的插件。通过content
对象。到现在为止,你会猜想content.getContent()
是你想要的url的内容。在插件代码中,将其写入某个文件。文件名应该基于url名称,否则很难处理。网址可以通过fit.url
获得。
您必须run Nutch in Eclipse做修改。
当你能够运行,打开Fetcher.java之间添加行“内容保护”命令行。
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 ---------------------------------------------\\
使用这种方法会跳过创建二进制文件吗? – 2012-12-26 00:06:29
不,这只是在创建二进制文件之前保存原始HTML文件。如果需要,您必须排除二进制文件创建行。不过,我认为这将是一项艰巨的工作,因为Nutch是一个非常庞大而复杂的项目。 – 2012-12-26 00:16:56
要更新这个答案 -
它可以从你的crawldb段文件夹上传过程中的数据,并在阅读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)
{
}
在apache Nutch 2.3中。1
您可以保存编辑原始的HTML代码的Nutch首先通过以下https://wiki.apache.org/nutch/RunNutchInEclipse
您结束在eclipse编辑文件FetcherReducer.java ruunning后的Nutch在Eclipse中运行Nutch的,这个代码添加到输出方法,运行ant再次蚀重建类
最后,原始的HTML将加入到reportUrl列在你的数据库
if (content != null) {
ByteBuffer raw = fit.page.getContent();
if (raw != null) {
ByteArrayInputStream arrayInputStream = new ByteArrayInputStream(raw.array(), raw.arrayOffset() + raw.position(), raw.remaining());
Scanner scanner = new Scanner(arrayInputStream);
scanner.useDelimiter("\\Z");//To read all scanner content in one String
String data = "";
if (scanner.hasNext()) {
data = scanner.next();
}
fit.page.setReprUrl(StringUtil.cleanField(data));
scanner.close();
}
谢谢你,TejasP。我刚刚听说Nutch有一个插件机制来扩展它的功能。我想知道我是否可以编写一些插件来实现它? – Freedom 2012-04-09 09:10:06
@Freedom:看到我上面的编辑。希望能帮助你。 – 2012-04-09 17:53:10
感谢您的详细信息,这对我非常有帮助。这是我跳入Nutch的指南。非常感谢! – Freedom 2012-04-10 02:25:03