導入と基本的な使い方 - Nutch調査録
-
概要
LinuxでNutchのソースを落としてantして、適当にコマンドを打ってみる。
@Author mwSoft
@Date 2010/12/11
@Env Nutch1.2/Fedora14 -
Nutchとは
NutchはLucene(全文検索エンジン)のサブプロジェクトとして開発された、Java製のクローラ。Webのリンクをたどりながらいい感じにページを収集して、いい感じにスコアを付けて、いい感じに全文検索(Lucene)用のインデックスも生成してくれる。
内部的にはHadoopのMapReduceを多用しているので、情報量が増えてもマシンを分散することでで対応することができる。
-
ダウンロードからantまで
以下の公式サイトから、Resources → Download → apache-nutch-1.2-src.tar.gz を落とす。
解凍してantする。尚、Javaは導入済みでPATHが通りJAVA_HOMEも設定してあってAntも入っているものとする。
// 解凍 $ tar xzvf apache-nutch-1.2-src.tar.gz $ cd apache-nutch-1.2 // antする $ ant
導入はこれだけ。エラーが出てなければこれで動くようになったはず。
バイナリも配布されているけど個人的にはソース版を落とした。なぜかというとNutchはドキュメントがあまりしっかりしてないので詳細を把握するにはソースを読むしかないと思ったので。
-
クロールしてみる
Nutchはbin/nutchというシェルから実行する。このシェルの中でCLASSPATHとか、環境変数とか、Javaの引数とか設定している。
シェルを使わずにmainクラスを実行しようとすると、このシェルが設定している引数を自前で設定しないといけないので割と面倒。
とりあえず一般的なクロールコマンドを実行してみよう。
まず、クロールの元になるURL一覧をファイルに出力しておく。試しにrobots.txtの内容からクローラは拒否してないっぽいように見えるlivedoorを対象にしてみる。
// url_listディレクトリの下に、livedoorのアドレスが入ったファイルを作る $ mkdir url_list $ echo "http://www.livedoor.com/" > url_list/url_list.txt
nutchは指定したディレクトリ配下に記述されたURLをクロール対象とする。
下記は、url_listというディレクトリ配下のファイルに記述されたURLを、深さ3までたどって、トップ10件までクロールするという意味。
$ bin/nutch crawl url_list -dir crawl -depth 3 -topN 10
何も設定しない状態でこのコマンドを実行すると
No URLs to fetch - check your seed list and URL filters.
というURLを一個も取りにいかなかったよ的なメッセージが表示される。
なんでかというと、初期設定では取得するURLがフィルタで設定されていて、全てのURLがクロール対象外にされてしまっているため。
というわけで、crawl-urlfilter.txtに書かれているフィルタを修正。
$ vi conf/crawl-urlfilter.txt // コメントアウト # -.*(/[^/]+)/[^/]+\1/[^/]+\1/ // この行を +^http://([a-z0-9]*\.)*MY.DOMAIN.NAME/ ↓ // なんでもアリに変える +^http://(.*)/
この辺のフィルタをうまいこと設定すれば、任意のサイトだけクロールさせることができる。指定のニュースサイトだけ新着情報を集めるとか。
フィルタも外したので、再実行する。
$ bin/nutch crawl url_list -dir crawl -depth 3 -topN 10
するとこんなエラーが出る。
Exception in thread "main" java.lang.IllegalArgumentException: Fetcher: No agents listed in 'http.agent.name' property.
ユーザエージェントの設定がされていませんよと言われているらしい。
リクエストに関する設定は、nutch-default.xmlに記述してある。
default.xmlを直接編集しても良いけど、風流じゃないのでnutch-site.xmlの方に書く。
$ cp conf/nutch-site.xml.template conf/nutch-site.xml $ vi conf/nutch-site.xml
さっそくユーザエージェントを書き換えてみる。configuration要素の中にこれを記述する。
<property> <name>http.agent.name</name> <value>ここにユーザエージェントを書く</value> </property>
さっそく、再実行してみる。
$ bin/nutch crawl url_list -dir crawl -depth 3 -topN 10
これでクロールに成功したはず。
-
実行結果を見てみる
クロールに成功すると、-dirに指定したディレクトリ(今回の例だとcrawl)の配下に、以下のようなディレクトリができる。
ディレクトリ名 内容 segments ダウンロードしたコンテンツを格納 linkdb 各ページのリンク情報 crawldb どのページをいつクロールしたかなどの情報を持つ index Luceneのインデックスファイルが格納される これらはそのままでは読めない状態で格納されているので、read用やdump用のコマンドを使って中身を見ることになる。
たとえばcrawldbの中を見たい場合は、readdbでdumpを取ると解りやすい。
$ bin/nutch readdb crawl/crawldb -dump dumpdir
こんな感じでreaddbを指定して、指定したcrawldb情報が入った情報のdumpを出力できる。
出力したファイルにはこんな情報が入っている。
$ vi dumpdir/part-00000 http://www.livedoor.com/ Version: 7 Status: 2 (db_fetched) Fetch time: Mon Jan 10 09:59:36 JST 2011 Modified time: Thu Jan 01 09:00:00 JST 1970 Retries since fetch: 0 Retry interval: 2592000 seconds (30 days) Score: 1.021511 Signature: 14b91002e0e58329dc0543fdb4bcc00d Metadata: _pst_: success(1), lastModified=0
こんな感じで、URLとStatus(fetch済みだよとか、まだ見てないよとか)、Fetch time(この前、fetchしたのはいつだよ)といった情報が入っている。crawlコマンドはこれを見て優先順位の高そうなURLから順にクロールしていく。
segmentsは少し特殊で、crawl/segmentsの中を見るとわかるけど、yyyymmddhhmmss形式のディレクトリが3つできてる。
$ ls crawl/segments 20101211095932 20101211095944 20101211095954
これはさっきのcrawlが-depth 3を指定してリンクをたどって3周ほどクロールしたので、ディレクトリが3つできた。再度実行すればもっと増える。
segmentsはコンテンツの本文が入っていてデータを1つのファイルで持ってしまうとサイズがエライことになるのでこうやって分割している。たぶん。
segmentsの中を見る場合はreadsegを使う。こんな感じで。
$ bin/nutch readseg -get crawl/segments/20101211095932 http://www.livedoor.com/
segmentsのディレクトリは日付のとこまで指定する。livedoorのURLは最初のディレクトリに入ってるはず。
実行すると、ParseText(テキストのみ)、outLink(LINK情報)、Content(本文)などが出力される。segmentsからはけっこういろんなものが取れる。
最後に検索を実行する。
普通ならここでSolrとか解説すると思うのだけど、自分はScalaからLuceneを使って出来上がった生のインデックスをロードする派なので、コマンドラインからの検索の解説に留める。
検索をするには、NutchBeanというクラスを実行する。
$ bin/nutch org.apache.nutch.searcher.NutchBean livedoor crawl
上記の例では、crawlというディレクトリに入ったindexを使って、livedoorという文字列を検索している。そうすると以下のような結果が表示される。
Total hits: 7 0 20101211095932/http://www.livedoor.com/ livedoor livedoor 統合検索 | ウ ... 1 20101211095944/http://blog.livedoor.com/ ... ドアブログ(livedoor Blog) - 無料・デ ... うする? ( 44 件) livedoor トップ ブロ ... 2 20101211095944/http://coupon.livedoor.com/ livedoor クーポン coupon ... 掲載 Copyright (C) 1996- livedoor Co.,Ltd. All rights reserved ... 3 20101211095944/http://map.livedoor.com/ ... ルメ MAPDATA:ZENRIN cMapion livedoor トップ livedoorをホームに ... シー Copyright c 1996-2010 ... 4 20101211095954/http://transit.livedoor.com/ ... ン 写真共有 livedoor トップ livedoorをホームに ... シー Copyright c 1996-2010 ... 5 20101211095944/http://clip.livedoor.com/ livedoor クリップ - ソ ... ーク ヘルプ livedoor [PR] ニュージ ... ねる弐式 lifehack2ch. ... 6 20101211095944/http://gourmet.livedoor.com/ livedoor グルメ - クチ ... 券が当たる livedoor グルメ 都道 ...
という感じでNutchは様々な情報を保存してくれる。各機能の詳細は別の機会に書く予定。