【发布时间】:2012-04-17 22:16:56
【问题描述】:
我是搜索引擎和网络爬虫的新手。现在我想将特定网站中的所有原始页面存储为 html 文件,但是使用 Apache Nutch 我只能获取二进制数据库文件。如何使用 Nutch 获取原始 html 文件?
Nutch 支持吗?如果没有,我还可以使用哪些其他工具来实现我的目标。(支持分布式爬取的工具更好。)
【问题讨论】:
标签: search-engine web-crawler nutch
我是搜索引擎和网络爬虫的新手。现在我想将特定网站中的所有原始页面存储为 html 文件,但是使用 Apache Nutch 我只能获取二进制数据库文件。如何使用 Nutch 获取原始 html 文件?
Nutch 支持吗?如果没有,我还可以使用哪些其他工具来实现我的目标。(支持分布式爬取的工具更好。)
【问题讨论】:
标签: search-engine web-crawler nutch
嗯,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 名称,否则很难使用它。网址可以通过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 ---------------------------------------------\\
【讨论】:
更新这个答案 -
可以将你 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
您可以通过编辑 Nutch 代码来保存原始 HTML,首先在 eclipse 中按照https://wiki.apache.org/nutch/RunNutchInEclipse运行 nutch
在 eclipse 编辑文件 FetcherReducer.java 中运行完 nutch 后,将此代码添加到输出方法中,再次运行 ant eclipse 以重建类
最终,原始 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();
}
【讨论】:
这里的答案已经过时了。现在,使用nutch dump 获取纯 HTML 文件是很可能的。请参阅this answer。
【讨论】: