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)