【发布时间】:2016-11-01 14:55:09
【问题描述】:
我想使用多个网页训练 NLP 模型以获得良好的精度。 由于我没有网页,我正在考虑在 Amazon EMR 上使用网络爬虫。 我想使用尊重 robots.txt 规则的分布式、可扩展和可扩展的开源解决方案。经过一番研究,我决定采用 Apache Nutch。
我发现 Nutch 的主要贡献者 Julien Nioche 的 this video 对入门特别有用。 虽然我使用了最新可用版本的 Hadoop (Amazon 2.7.3) 和 Nutch (2.3.1),但我还是成功地完成了一个小示例作业。
不幸的是,我找不到从 Nutch 的输出中检索原始 html 文件的简单方法。在寻找解决这个问题的方法时,我发现了一些其他有用的资源(除了 Nutch 自己的 wiki 和 tutorial 页面)。
其中一些(如this answer 或this page)建议实现一个新的插件(或修改现有的):总体思路是添加几行代码在将任何获取的 html 页面的内容发送到段之前,实际上将其保存到文件中。
其他人(如this answer)建议实施一个简单的后处理工具来访问这些段,检查其中包含的所有记录并将任何看起来是html页面的内容保存到文件中.
这些资源都包含(或多或少精确的)说明和代码示例,但是当我尝试运行它们时没有运气,因为它们引用了非常旧的 Nutch 版本。此外,由于缺乏资源/文档,我所有将它们调整为 Nuth 2.3.1 的尝试都失败了。
例如,我将以下代码附加到HtmlParser(parse-html 插件的核心)的末尾,但是保存在指定文件夹中的所有文件都是空的:
String html = root.toString();
if (html == null) {
byte[] bytes = content.getContent();
try {
html = new String(bytes, encoding);
} catch (UnsupportedEncodingException e) {
LOG.trace(e.getMessage(), e);
}
}
if (html != null) {
html = html.trim();
if (!html.isEmpty()) {
if (dumpFolder == null) {
String currentUsersHomeFolder = System.getProperty("user.home");
currentUsersHomeFolder = "/Users/stefano";
dumpFolder = currentUsersHomeFolder + File.separator + "nutch_dump";
new File(dumpFolder).mkdir();
}
try {
String filename = base.toString().replaceAll("\\P{LD}", "_");
if (!filename.toLowerCase().endsWith(".htm") && !filename.toLowerCase().endsWith(".html")) {
filename += ".html";
}
System.out.println(">> " + dumpFolder+ File.separator +filename);
PrintWriter writer = new PrintWriter(dumpFolder + File.separator + filename, encoding);
writer.write(html);
writer.close();
} catch (Exception e) {
LOG.trace(e.getMessage(), e);
}
}
}
在另一种情况下,我得到了以下错误(我喜欢这个错误,因为它提到了序言,但它也让我感到困惑):
[Fatal Error] data:1:1: Content is not allowed in prolog.
所以,在考虑将我的设置降级到 Nutch 1.x 之前,我的问题是:你们中的任何人都曾在使用最新版本的 Nutch 时遇到过这个问题并成功解决了吗? p>
如果是这样,您能否与社区分享或至少提供一些有用的解决方案指针?
非常感谢!
PS:如果您想知道如何在 IntelliJ 中正确打开 Nutch 源,this answer 实际上可能会为您指明正确的方向。
【问题讨论】:
标签: html web-scraping web-crawler nutch hadoop2