検索エンジンを作る(予定)その2 〜 Nutchについて少し解説
その3はこちら。
概要
前回はNutch + HBaseでクローラーを動かすところまでを書いた。
今回はNutchの動作の仕組み、起動オプション、設定項目をちょっと解説。
(理解が浅い or 間違っている箇所も多いと思うので、何かあれば指摘して頂けると助かります)
Nutchの動作の仕組み
このブログ記事を見てもらえば大体分かると思う、などと言っちゃうと身も蓋もないし、英語が苦手な方もいるかもしれないので若干補足。
Nutchはいくつかのフェーズに分かれていて、それぞれNutch起動時のサブコマンド名になっている。
- inject
- generate
- fetch
- parse
- updatedb
inject
前回seedについて少し説明したが、injectフェーズではそのseed URLが初期データとしてDB(HBaseやMySQL)に投入され、以降のフェーズの元データとなる。
generate
injectで投入されたURLに_gnmrk_というマークが付けられて、「バッチID」が生成される。以降のフェーズではこのバッチID単位で処理される。
fetch
その名の通り、Webページを取ってくる。処理対象のURLはgenerateで処理されたもの。
parse
これもその名の通り、HTMLの内容をパースし、以下の様な内容が作成される。
- ページ内のテキスト
- 外向けのリンクのリスト
updatedb
パースした内容を元に、DBを更新する。
ページAからページB, C, Dへのリンクが張られていたとしたら、それらのページが次回のfetchの対象となる。
(crawl)
crawlというサブコマンドを実施すると、上のフェーズが一気に実施される。また、depthを指定することで、リンクをいくつ辿るかが設定できる。depthを大きくするとクロールに非常に時間がかかるので注意(というか終わらない場合も)。
depthのデフォルトは昔は5だったみたいだけど、今も一緒だろうか?RTFSですかね。
コマンドラインオプション
代表的なのをいくつか説明しようと思ったら、一覧ページが存在する事に気づいたので省略。
Webで検索して出てくる情報は1.xのものが多く、そのまま実行しても動かない事が多いので、まずは上の対応表で確認すると良い。
Nutchの設定項目(前回説明していないの)
db.ignore.external.links
nutch-site.xml に以下のように設定すると、外部サイトへのリンクは辿らなくなる。
<property> <name>db.ignore.external.links</name> <value>true</value> </property>
この場合、seedに記載したURLのドメインしか検索されない。イントラネットの検索や、特定のサイトの検索の場合に使用する。
User-Agent関連
クロールするときのUser-Agentヘッダを自由に変えられる。"k4200 super cool bot"みたいな厨二っぽいのでもいいし、Googleとかのボットと同じにしてもいいし、Chromeとかを偽装してもよし。それぞれのメリット・デメリットについては省略。
チューニング関連
現在調査中。ある程度調べたらまとめてエントリーにするかも・・・