【问题标题】:How do I save the origin html file with Apache Nutch如何使用 Apache Nutch 保存原始 html 文件
【发布时间】:2012-04-17 22:16:56
【问题描述】:

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

Nutch 支持吗?如果没有,我还可以使用哪些其他工具来实现我的目标。(支持分布式爬取的工具更好。)

【问题讨论】:

    标签: search-engine web-crawler nutch


    【解决方案1】:

    嗯,nutch 会将抓取的数据以二进制形式写入,因此如果您希望将其保存为 html 格式,则必须修改代码。 (如果您是 nutch 新手,这会很痛苦)。

    如果您想要快速简便的获取 html 页面的解决方案:

    1. 如果您打算拥有的页面/网址列表非常少,那么最好使用为每个网址调用 wget 的脚本来完成。
    2. 或使用HTTrack 工具。

    编辑:

    编写自己的 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获取。

    【讨论】:

    • 谢谢你,TejasP。我刚刚听说 Nutch 有一个插件机制来扩展它的功能。我想知道我是否可以编写一些插件来实现它?
    • 感谢您提供的详细信息,这对我很有帮助。这是我进入 Nutch 的指南。非常感谢!
    【解决方案2】:

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

    【讨论】:

    • 使用此方法是否也会跳过创建二进制文件?
    • 不,这只是在创建二进制文件之前保存原始 HTML 文件。如果需要,您必须排除二进制文件创建行。但是,我认为这将是一项艰巨的工作,因为 Nutch 是一个非常庞大且复杂的项目。
    【解决方案3】:

    更新这个答案 -

    可以将你 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)
        {
    
        }
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 你少了一个括号。
      【解决方案5】:

      这里的答案已经过时了。现在,使用nutch dump 获取纯 HTML 文件是很可能的。请参阅this answer

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-12
        • 2018-11-04
        • 2020-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-09
        • 1970-01-01
        相关资源
        最近更新 更多