Nutch:特定の文字列が続くURLをクロール対象外にする
Nutchのcrawl-urlfilter.txtを弄ることでクロールさせるURLを正規表現で指定できるんだけれど、許可指定しているURLに含まれる一部のURLを許可しないという事が出来ないみたい。
例えば、crawl-urlfilter.txtに
+^http://test\.co\.jp/ -^http://test\.co\.jp/notaccept/
こんな感じに指定した場合、
http://test.co.jp/notaccept/
はクロール許可したくないんだけれど、
http://test.co.jp/
が許可されてしまっているからこちらが優先されて、
http://test.co.jp/notaccept/
までも許可した事になってしまう。
この問題をどうにかするべく色々調べた結果、正規表現の否定先読みっていうのを使うと良いみたい。
否定先読み
(?!任意の正規表現)
これは、それ以前の正規表現に指定した任意の文字列が続かないっていう条件を付けるもの(多分)
上の例で行くと、
+^http://test\.co\.jp/ -^http://test\.co\.jp/notaccept/
こうではなくて、
+^http://test\.co\.jp/(?!notaccept)
こうすることで、
後ろに「notaccept」が続かない「http://test.co.jp/」
っていう正規表現を作ることが出来る。
追記
否定先読みの正規表現部分にはORは使えない模様…?
複数の文字列を除外したい場合には否定先読みを連続して書けばOK。
× (?!aaa|bbb) × (?!(aaa|bbb)) ○ (?!aaa)(?!bbb)
Nutch:修正したソースをコマンド実行に反映させる
Eclipseならソースを修正して実行ボタン押せば普通に動くけど、コマンドで実行させる場合はちょっとした作業が必要。
修正したソースは全て
./src/
フォルダ内に入っているものとする。
nutchのバージョンは1.0。
移動
修正したファイルだけbuildフォルダから移動させる。
プラグイン以外の場合
まず、
./nutch-1.0.jar
を解凍して
./nutch-1.0/
フォルダを生成しておく。
次に、
./build/classes/org/apache/nutch/パッケージ名/クラス名.class
を
./nutch-1.0/org/apache/nutch/パッケージ名/
に移動。
nutch-1.0.job
./build/nutch-1.0.job
を
./
に移動。
(これ、何に使われているのかちょっと分からないけどとりあえず上書き)
実行
後は
$nutch crawl urls crawl -depth 10 -topN 100
とかすれば修正された部分が反映されているはず。
Nutch:OutOfMemoryの続き
confの「io.sort.mb」の値が
100だと、1周目のInjectorでエラー。
60だと、1周目のcrawlDBあたりでエラー。
55だと、2、3周のどっかでエラー。
30だと、25周くらいでエラー。
10だと、43周くらいでエラー。
とりあえず減らせば長く持つんだけど、根本的な解決にはならない。
色々調べてるけど原因が分からない。
Nutch:24時間クロール
Crawl.main()をループで呼ぶと25周した後のGeneratorで何故かOutOfMemoryする。
topNがいくつであっても多分同じ。
topN=100程度だと1時間くらいでエラー出ちゃうから、topN=1000にして放置。
時間設定を24時間にしてみたけど、最後まで動いてたみたい。
topN=1000にしてあっても、必ずしも1000個の文書を取ってくるわけではなくて、最大1000という事らしい。
24時間実行でループが20周。
取得した文書数は数えるの面倒だから数えてないけど、条件にマッチしてきちんと抜き出せた文書が8234個。
これだけあれば一応それなりの実験は出来そうかな?