org.apache.nutch.crawl.crawl類的主函式如下所示:
// 應該知道,nutch查詢檔案系統是基於linux系統的機制的,所以提供啟動的命令與linux的shell命令很相似。
public static void main(string args) throws exception
configuration conf = nutchconfiguration.create();
// 使用靜態類nutchconfiguration建立乙個org.apache.hadoop.conf.configuration例項,可以在hadoop的源**中檢視到該類的定義(讀取hadoop-site.xml配置檔案)
conf.adddefaultresource("crawl-tool.xml");
// 讀取並設定抓取工具的配置檔案,可以在nutch-0.9\conf目錄下找到
crawl-tool.xml檔案
jobconf job = new nutchjob(conf);
// 抓取任務配置例項的建立
path rooturldir = null;
// 初始urls檔案所在的目錄,使用hadoop的org.apache.hadoop.fs.path類建立目錄
path dir = new path("crawl-" getdate());
// 設定預設抓取到網頁的存放目錄。如果命令列中沒有指定-dir 的值就會使用預設的值:crawl-時間。
int threads = job.getint("fetcher.threads.fetch", 10);
// 設定預設抓取工作啟動執行緒數目,預設值為10。
int depth = 5;
// 預設抓取工作遍歷深度,預設值為5。
int topn = integer.max_value;
// 抓取任務抓取網頁的數量,預設為最大值。
for (int i = 0; i < args.length; i ) else if ("-threads".equals(args[i])) else if ("-depth".equals(args[i])) else if ("-topn".equals(args[i])) else if (args[i] != null)
} filesystem fs = filesystem.get(job);
// 根據抓取工作配置jobconf建立乙個用來存放抓取到的網頁的目錄。
if (fs.exists(dir))
if (log.isinfoenabled())
// 在目錄dir下面建立下面5個目錄,用來存放,抓取工作過程中不同操作生成的檔案或者目錄。
path crawldb = new path(dir "/crawldb");
path linkdb = new path(dir "/linkdb");
path segments = new path(dir "/segments");
path indexes = new path(dir "/indexes");
path index = new path(dir "/index");
path tmpdir = job.getlocalpath("crawl" path.separator getdate());
injector injector = new injector(conf);
// 根據configuration conf建立乙個injector例項
generator generator = new generator(conf);
// 根據configuration conf建立乙個generator例項
fetcher fetcher = new fetcher(conf);
// 根據configuration conf建立乙個fetcher例項
parsesegment parsesegment = new parsesegment(conf);
// 根據configuration conf建立乙個parsesegment例項
crawldb crawldbtool = new crawldb(conf);
// 根據configuration conf建立乙個crawldb例項
linkdb linkdbtool = new linkdb(conf);
// 根據configuration conf建立乙個linkdb例項
indexer indexer = new indexer(conf);
// 根據configuration conf建立乙個indexer例項
deleteduplicates dedup = new deleteduplicates(conf);
// 根據configuration conf建立乙個deleteduplicates例項
indexmerger merger = new indexmerger(conf);
// 根據configuration conf建立乙個indexmerger例項
// 初始化crawldb
injector.inject(crawldb, rooturldir);
// 從rooturldir目錄中讀取初始化urls,將urls注入到crawldb實體中去
int i;
for (i = 0; i < depth; i )
fetcher.fetch(segment, threads);
// 根據配置的執行緒數開始抓取網頁檔案
if (!fetcher.isparsing(job))
crawldbtool.update(crawldb, new path, true, true);
// 更新crawldb
}if (i > 0) );
// 複製索引檔案
merger.merge(fs.listpaths(indexes), index, tmpdir);
// 將索引目錄index中的索引檔案合併後寫入到indexes目錄中
} else
if (log.isinfoenabled()) }
通過上面的源**的整體分析,總結一下具體都在這裡做了哪些工作:
1、讀取命令列引數,合法以後才繼續初始化配置例項;
2、通過讀取hadoop-site.xml配置檔案,初始化乙個configuration例項,並根據crawl-tool.xml檔案內容設定抓取工作配置;
3、設定一些預設抓取工作引數,如果命令列中沒有指定就會按照預設的引數值進行抓取工作的執行,比如,抓取工作抓取到的網頁檔案存放目錄rooturldir、啟動的抓取工作程序數threads、抓取深度depth、抓取網頁數量topn;
4、建立抓取工作抓取到的網頁檔案的存放目錄,及其子目錄(crawldb、linkdb、segments、indexes、index),這些子目錄有的是用來存放原生網頁,有的是預處理網頁檔案,有的是網頁解析出的文字內容及其其它相關資料等等;
5、在抓取工作及其索引過程中,要進行很多操作來對網頁檔案或資料進行處理,這通過初始化一些實現了這些操作的類的例項來完成的,例如:injector、generator、fetcher、parsesegment、crawldb、linkdb、indexer、deleteduplicates、indexmerger。這些類中,有的是作為實體類,像crawldb、linkdb,它們需要在抓取工作執行過程中及時更新,保持資料狀態的處於良好正確狀態。
6、最後,就開始執行相關操作了,包括初始化crawldb、生成抓取工作列表、抓取網頁檔案、更新crawldb、倒排links、建立索引、複製索引檔案、合併索引檔案。
nutch原始碼閱讀 1 Crawl
org.apache.nutch.crawl.crawl實現的是乙個完成的抓取過程,所以由它開始。perform complete crawling and indexing to solr given a set of root urls and the solr parameter respec...
Nutch抓取原始碼分析之Crawl類
1 初始化乙個configuration例項設定抓取工作配置 2 設定一些預設抓取工作引數,比如程序數threads 抓取深度depth 抓取網頁數量topn 3 建立抓取工作抓取到的網頁檔案的存放目錄 crawldb linkdb segments indexes index 用來存放原生網頁,以...
cvDilate 原始碼分析 1
在cv.h檔案中對cvdilate的定義如下 cvapi void cvdilate const cvarr src,cvarr dst,iplconvkernel element cv default null int iterations cv default 1 iplconvkernel 指...