1. 程式人生 > >Nutch2.2.1介紹及使用

Nutch2.2.1介紹及使用

1. Nutch介紹

Nutch是一個開源的網路爬蟲專案,更具體些是一個爬蟲軟體,可以直接用於抓取網頁內容。

現在Nutch分為兩個版本,1.x和2.x。1.x最新版本為1.7,2.x最新版本為2.2.1。兩個版本的主要區別在於底層的儲存不同。

1.x版本是基於Hadoop架構的,底層儲存使用的是HDFS,而2.x通過使用Apache Gora,使得Nutch可以訪問HBase、Accumulo、Cassandra、MySQL、DataFileAvroStore、AvroStore等NoSQL。

2. 編譯Nutch

Nutch1.x從1.7版本開始不再提供完整的部署檔案,只提供原始碼檔案及相關的build.xml檔案,這就要求使用者自己編譯Nutch,而整個Nutch2.x版本都不提供編譯完成的檔案,所以想要學習Nutch2.2.1的功能,就必須自己手動編譯檔案。

2.1 下載解壓

$ wget http://archive.apache.org/dist/nutch/2.2.1/apache-nutch-2.2.1-src.tar.gz
$ tar zxf apache-nutch-2.2.1-src.tar.gz

2.2 編譯

$ cd apache-nutch-2.2.1
$ ant

有可能你會得到如下錯誤:

Trying to override old definition of task javac
  [taskdef] Could not load definitions from resource org/sonar/ant/antlib.xml. It could not be found.

ivy-probe-antlib:

ivy-download:
  [taskdef] Could not load definitions from resource org/sonar/ant/antlib.xml. It could not be found.

解決辦法:

  1. 下載sonar-ant-task-2.1.jar,將其拷貝到apache-nutch-2.2.1目錄下面
  2. 修改build.xml,引入上面新增的jar包:
<!-- Define the Sonar task if this hasn't been done in a common script -->
<taskdef uri="antlib:org.sonar.ant" resource="org/sonar/ant/antlib.xml">
    <classpath path="${ant.library.dir}" />
    <classpath
path="${mysql.library.dir}" /> <classpath><fileset dir="." includes="sonar*.jar" /></classpath> </taskdef>

Nutch使用ivy進行構建,故編譯需要很長時間,如果編譯時間過長,建議修改maven倉庫地址,修改方法:

通過用http://mirrors.ibiblio.org/maven2/替換ivy/下ivysettings.xml中的http://repo1.maven.org/maven2/來解決。程式碼位置為:

<property name="repo.maven.org" value="http://repo1.maven.org/maven2/" override="false"/>

編譯之後的目錄如下:

➜  apache-nutch-2.2.1  tree -L 1
.
├── CHANGES.txt
├── LICENSE.txt
├── NOTICE.txt
├── README.txt
├── build
├── build.xml
├── conf
├── default.properties
├── docs
├── ivy
├── lib
├── runtime
├── sonar-ant-task-2.1.jar
└── src

7 directories, 7 files

可以看到編譯之後多了兩個目錄:build和runtime

3. 修改配置檔案

由於Nutch2.x版本儲存採用Gora訪問Cassandra、HBase、Accumulo、Avro等,需要在該檔案中制定Gora屬性,比如指定預設的儲存方式gora.datastore.default= org.apache.gora.hbase.store.HBaseStore,該屬性的值可以在nutch-default.xml中查詢storage.data.store.class屬性取得,在不做gora.properties檔案修改的情況下,儲存類為org.apache.gora.memory.store.MemStore,該類將資料儲存在記憶體中,僅用於測試目的。

修改 conf/nutch-site.xml

<property>
  <name>storage.data.store.class</name>
  <value>org.apache.gora.hbase.store.HBaseStore</value>
  <description>Default class for storing data</description>
</property>

修改 ivy/ivy.xml

<!-- Uncomment this to use HBase as Gora backend. -->
<dependency org="org.apache.gora" name="gora-hbase" rev="0.3" conf="*->default" />

修改 conf/gora.properties,確保HBaseStore被設定為預設的儲存,

gora.datastore.default=org.apache.gora.hbase.store.HBaseStore

因為這裡用到了HBase,故還需要一個HBase環境,你可以使用Standalone模式搭建一個HBase環境,請參考 HBase Quick Start。需要說明的時,目前HBase的版本要求為 hbase-0.90.4。

4. 整合Solr

由於建索引的時候需要使用Solr,因此我們需要安裝並啟動一個Solr伺服器。

4.1 下載,解壓

$ wget http://mirrors.cnnic.cn/apache/lucene/solr/4.8.0/solr-4.8.0.tgz 
$ tar -zxf solr-4.8.0.tgz

4.2 執行Solr

$ cd solr-4.8.0/example
$ java -jar start.jar

驗證是否啟動成功

4.3 修改Solr配置檔案

apache-nutch-2.2.1/conf/schema-solr4.xml拷貝到solr-4.8.0/solr/collection1/conf/schema.xml,並在<fields>...</fields>最後新增一行:

<field name="_version_" type="long" indexed="true" stored="true" multiValued="false"/>

重啟Solr,

# Ctrl+C to stop Solr
$ java -jar start.jar

5. 抓取資料

編譯後的指令碼在 runtime/local/bin 目錄下,可以執行命令檢視使用方法:

crawl命令:

$ cd runtime/local/bin 
$ ./crawl 
Missing seedDir : crawl <seedDir> <crawlID> <solrURL> <numberOfRounds>

nutch命令:

$ ./nutch 
Usage: nutch COMMAND
where COMMAND is one of:
 inject     inject new urls into the database
 hostinject     creates or updates an existing host table from a text file
 generate   generate new batches to fetch from crawl db
 fetch      fetch URLs marked during generate
 parse      parse URLs marked during fetch
 updatedb   update web table after parsing
 updatehostdb   update host table after parsing
 readdb     read/dump records from page database
 readhostdb     display entries from the hostDB
 elasticindex   run the elasticsearch indexer
 solrindex  run the solr indexer on parsed batches
 solrdedup  remove duplicates from solr
 parsechecker   check the parser for a given url
 indexchecker   check the indexing filters for a given url
 plugin     load a plugin and run one of its classes main()
 nutchserver    run a (local) Nutch server on a user defined port
 junit          runs the given JUnit test
or
 CLASSNAME  run the class named CLASSNAME
Most commands print help when invoked w/o parameters.

接下來可以抓取網頁了。

6. 參考文章

Nutch介紹及使用