Fre*_*dom 5 search-engine web-crawler nutch
我是搜索引擎和网络抓取工具的新手.现在我想将特定网站中的所有原始页面存储为html文件,但是使用Apache Nutch我只能获取二进制数据库文件.如何使用Nutch获取原始html文件?
Nutch支持吗?如果没有,我可以使用哪些其他工具来实现我的目标.(支持分布式爬网的工具更好.)
那么,nutch将以二进制形式编写已爬网数据,因此如果您希望以html格式保存,则必须修改代码.(如果你是nutch的新手,这将是痛苦的).
如果您想获得快速简便的html页面解决方案:
wget
每个网址的脚本来完成.编辑:
编写自己的nutch插件会很棒.您的问题将得到解决,您可以通过提交您的工作为nutch做出贡献!如果你是nutch的新手(在代码和设计方面),那么你将不得不投入大量时间来构建一个新的插件......否则很容易做到.
很少有人帮助你的主动:
这是一个讨论编写自己的nutch插件的页面.
从Fetcher.java开始.见第647-648行.在这里,您可以按网址获取获取的内容(对于那些成功获取的页面).
pstatus = output(fit.url, fit.datum, content, status, CrawlDatum.STATUS_FETCH_SUCCESS);
updateStatus(content.getContent().length);
Run Code Online (Sandbox Code Playgroud)
你应该在此之后添加代码来调用你的插件.将content
对象传递给它.到现在为止,您可能已经猜到这content.getContent()
是您想要的网址内容.在插件代码中,将其写入某个文件.文件名应该基于url名称,否则将很难使用它.网址可以通过fit.url
.
当您能够运行时,打开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 ---------------------------------------------\\
Run Code Online (Sandbox Code Playgroud)
要更新此答案 -
可以从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)
{
}
Run Code Online (Sandbox Code Playgroud)