2012-04-04 30 views
4

我是新的搜索引擎和网络爬虫。现在我想将所有原始页面作为html文件存储在特定网站中,但使用Apache Nutch,我只能获取二进制数据库文件。我如何使用Nutch获取原始html文件?如何保存原点HTML文件与Apache的Nutch

是否Nutch的支持呢?如果没有,我可以用什么样的工具来实现我的目标。(支持分布式抓取工具更好。)

回答

9

好,Nutch的会写以二进制形式抓取的数据,所以如果你想,要保存在html格式,你将不得不修改代码。 (如果你是新手,这会很痛苦)。

如果你想要得到的HTML页面快速和简单的解决方案:

  1. 如果页/你打算已经是相当低的话,最好把它与用于调用wget脚本完成的URL列表每个网址。
  2. 或使用HTTrack工具。

编辑:

写你自己的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获得。

+0

谢谢你,TejasP。我刚刚听说Nutch有一个插件机制来扩展它的功能。我想知道我是否可以编写一些插件来实现它? – Freedom 2012-04-09 09:10:06

+0

@Freedom:看到我上面的编辑。希望能帮助你。 – 2012-04-09 17:53:10

+0

感谢您的详细信息,这对我非常有帮助。这是我跳入Nutch的指南。非常感谢! – Freedom 2012-04-10 02:25:03

6

您必须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 ---------------------------------------------\\ 
+0

使用这种方法会跳过创建二进制文件吗? – 2012-12-26 00:06:29

+0

不,这只是在创建二进制文件之前保存原始HTML文件。如果需要,您必须排除二进制文件创建行。不过,我认为这将是一项艰巨的工作,因为Nutch是一个非常庞大而复杂的项目。 – 2012-12-26 00:16:56

5

要更新这个答案 -

它可以从你的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) 
    { 

    } 
0

在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(); 
}