如何读取nutch抓取数据

如何读取nutch抓取数据

1.首先nutch的配置已经在博客里面写好了,如果还不知道,建议现看下,然后再读这篇文章。
2.用一个SequenceFile.Reader来读取排序的输入。SequenceFile.Reader m_reader = m_reader = new SequenceFile.Reader(fs, content, conf);
3.用NutchConfiguration.create()实例化一个Configuration的对象conf。
  Configuration conf = NutchConfiguration.create();
  //实例化一个path的路径,"path"是我们通过读取配置文件(conf.properties)获取的路径
  Path content = new Path(path + "/data");
  //通过这个路径就可有得到文件所在的位置。
  FileSystem fs = content.getFileSystem(conf);
4.下面看下完整的代码
public class ContentReader
{
    private SequenceFile.Reader m_reader = null;
   
    public ContentReader(String path) throws Exception
    {
        Configuration conf = NutchConfiguration.create();
        Path content = new Path(path + "/data");
        FileSystem fs = content.getFileSystem(conf);
        m_reader = new SequenceFile.Reader(fs, content, conf);
    }

    public boolean next(Content content) throws Exception
    {
        Text key = new Text();
        boolean ret = m_reader.next(key, content);

        if (!ret)
        {
            m_reader.close();
        }
        return ret;
    }
}
5.通过读取配置文件获取HDFS的路径
(1):我们获取的nutch所产生的路径是:/home/user/xipei/nutch1.0/crawl/segments/20091215145839/content/data.
      这里面有一些属性比如version、url、content等,有兴趣的朋友可以看下它的源代码。
(2):20091215145839 : 这是nutch在抓取时候所产生的14位的时间。当然我们完全可有只通过读./segements/。就可以读取到下面所有的14位时间的文件夹。下面来看程序:
    /**
     * According to the path of a path to obtain hdfs
     * @param prefixPath
     * @return
     */
    public static List<String> getHdfsPath(String prefixPath) {
        List<String> hdfsPaths = new ArrayList<String>();
        Path path = new Path(prefixPath);
        Configuration conf = NutchConfiguration.create();
        JobConf job = new JobConf(conf);
        try {
        FileSystem fs = FileSystem.get(job);
        FileStatus[] fileStatus = fs.listStatus(path);
        String suffixPath = "content"+File.separator+"part-00000";
        if (fileStatus == null) return null;
        for (int i = 0; i < fileStatus.length; i++) {
            hdfsPaths.add(prefixPath + File.separator + fileStatus[i].getPath().getName() + File.separator + suffixPath);
        }       
       
        } catch(Exception e) {
            e.printStackTrace();
        }
        return hdfsPaths;
    }
     注意:  这个方法的 prefixPath : 就是上面所写的那个路径。只要传递正确就可有循环获取到。
(3):简单看下怎么读取里面的url就可以了,其它的类似。
    /**
     * get list<String>
     * @param hdfsPath
     * @return
     */
    public static List<String> getUrl(String hdfsPath) {
        List<String> urls = new ArrayList<String>();
        try {
            reader = new ContentReader(hdfsPath);
            Content content = new Content();
            while(reader.next(content)) {
                String url = content.getUrl() != null ? content.getUrl() : "";
                urls.add(url);
            }           
        } catch (Exception e) {
            e.printStackTrace();
        }
       
        return urls;
    }   

你可能感兴趣的:(Nutch)