Gunghoなんてソフトウェアをアクティブに書いているものだから色々とクローリングするソフトを書く事がとても多い。しかしそれでもやっぱりプロジェクト毎に微妙に条件が違ったり、クロール対象が違ったりするのであまり一般化できない仕組みが結構ある。

やっぱり一番難しいのが「このリンクはフォローしない」ルールで、まぁrobots.txtとかメタタグに書かれてるならやりやすいのだけれども問題は別にリンクを辿る事自体は誰にも禁止されてないんだけど、あるパターンのURLを辿って行くと最終的に集めてくるデータセットが汚染される、というケース。

これ、正直どうしようもない気がするんだけど・・・できれば一般化したい。

今特に対処しようと思っているのは「外部からリンクされている最初のページには用があるんだけれども、それ以降はそのドメインには用がないページ」。これは一般化できるかもしれん。

取り急ぎまず実装したいのは、超一般的な「あるサイトにあるリンクを抽出して、それらに対して一定のルールでその後クロールするかどうか」を簡単にかけるコンポーネントかな。イメージとしては
# config components: - FollowLink follow_link: strategies: - module: IgnoreHost sites: - regex: \.amazon\.co.\.jp$ - module: FollowIfAnotherConditionMet # Handler code sub handle_response { my ($self, $c, $req, $res) = @_; $c->follow_link($res); }

みたいな感じ。ちょっとこれは後で考える。