如何使用Apache Nutch保存原始html文件

Fre*_*dom 5 search-engine web-crawler nutch

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

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

Tej*_*til 9

那么,nutch将以二进制形式编写已爬网数据,因此如果您希望以html格式保存,则必须修改代码.(如果你是nutch的新手,这将是痛苦的).

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

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

编辑:

编写自己的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.


İsm*_*kan 6

你必须Eclipse运行Nutch进行修改.

当您能够运行时,打开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)


and*_*kus 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)
    {

    }
Run Code Online (Sandbox Code Playgroud)