クローラー開発の知見
- 鍵は「リンク先を辿るか辿らないか」の処理。
- この処理が甘ければ甘いほど、同一サイトのクロールが遅くなります。同じ URL を踏まないようにするため、以前辿った URL を除外したり、パラメータをイイ感じに省いて正規化してあげる必要があります。
- (鍵は「クロール枠の節約」と言い換える事も出来ます)
- 特別なことが無い限りは
?
,#
移行は捨てる - ただし、一部サイトはまだ
?id=hoge
などとやっている - canonical を使った URL 正規化の判断はけっこう面倒くさいです
- 既に辿った URL は KVS に突っ込んでおく。
- 5 万ページ程度のクロールでも 150 万くらいのリンクがあります
- MySQL とかに突っ込むと既に辿ったページを判定する為のクエリがとても重い
- 素直に KVS に突っ込みましょう(AppEngine なら Datastore + Memcache)
- ページをクロールするときはとりあえず丸ごと S3 とかに突っ込んでおく
同一ホストに対しては 1 秒 1 URL のリクエスト、とクロール枠を定めると、一日あたり 86400 ページしか取得出来ません。 URL 正規化をミスると簡単に本来の 10~100 倍ほどのクロール対象 URL が出来てしまうので、URL 正規化をキチンとやらないとクロールが一生終わりません。