スパイダーとクローラが別物なわけ 7

またまたSEOのお話

最近SEO BookMark なるものがあって
登録してみたんですが、見てるだけで色々新しい発見あって面白いです。
(SEOのナレッジのために自分はSEO Vertical Blog Searchを作ったんですが、
明らかにこっちのがクオリティも量も新規性も維持できますね~ カシコイ!もうこれやめよっかな。)

それはそうとまた面白い記事を見つけたのでちょっとエントリー

検索エンジンの5つのプログラム – スパイダーとクローラって別物? in SEOブログ from SEO塾

よくよく考えてみると当たり前なんですが、
確かに言及するにいたってないですね。気づくことって重要ですね。
こういう時海外の情報をすばやく取得できる人がすごいです。
*ちなみにSEO Vertical Blog Searchでもスパイダーとクローラは別になっています。
⇒が独立モジュールではありません。

ということで、どうしてこうなるかというお話。

スパイダーとクローラが別である理由

(スパイダーとかクローラとか名前はどうでもいいんですが、ようは
URLリストを作るプログラムと
キャッシュするプログラムってことです。)

開発者っぽい視点で検索エンジンを考えてみるとこうなります。

●ほしいもの
検索エンジンを作るためのDB作成

ブレイクダウン:WEB全体のページデータがほしい(できるだけ新鮮なのがいい)
       :ページを取得するためにURLリストがほしい(新鮮なページのために新鮮なURLがいい)
       :ページ全体を分析したい
       :分析したやつを超早く出力したい

⇒という要望なので、こんなかんじにしましょう
1:WEBのURLリストが最速でほしい(スパイダー)
2:URLリストを順に見て行ってデータをひとまず保存したい(クローラ*キャッシュ)
3:WEBページを色々分析したい(インデクサ)
4:分析結果をすばやく検索結果として出力したい(アウトプット)

#なぜURLリストが最速で欲しいかというと、
#そのURLリストがそのままデータの鮮度に直結するからです。
#このリスト作成サイクルが早くなればなるほど、情報の鮮度がよくなります。

じゃあどうするかってことで、

スパイダーとクローラが同じ場合

プログラム1:URLリストDBを元にURLにアクセスして「以前と変更があったらキャッシュDBに格納」し、
       そのキャッシュにあるURLを抽出して、「既存にあるURLと重複がなければURLリストDBに格納」する
プログラム2:キャッシュDBのデータを色々分析
プログラム3:検索結果を出力

->この場合単純に1プログラムの負荷が高すぎるというのもありますが、
 URLリストの作成とキャッシュを作成してURLリストを作成するのが同時なので、
 一回のプログラムの実行時間が長くなってしまい、URLリストの鮮度が保てません。
 *しかもこの場合、キャッシュしたページのURLを優先するのか、リストを優先するのかとか、
  いろいろクローラー<>スパイダー間の関係が複雑になります。
 さらにプログラムのチューンアップとかも考えると、別モジュールにしたほうがよいです。

*よくあるアルゴリズムを更新しました とかのときに、
  URLリストから生成しなくてはならないのも問題ですね。

スパイダーとクローラをわける場合

プログラム1:キャッシュDBを順番に見ていって「既存にあるURLと重複がなければURLリストDBに格納」する
プログラム2:URLリストDBからURLにアクセスして「以前と変更があったらキャッシュDBに格納」する
プログラム3:キャッシュDBのデータを色々分析
プログラム4:検索結果を出力

->プログラムが増えますが、URLリストを作りつつ別軸でキャッシュもできるので、
 優先的にキャッシュしたいURLなんかを設定したとしても、URLリストの作成に影響がでません。
 URLリストの優先順位とかキャッシュするしないの閾値とか、そういうチューンアップも
 別々に行えます。

おまけでインデクサとスパイダーをくっつける場合

プログラム1:URLリストDBからURLにアクセスして「以前と変更があったらキャッシュDBに格納」する
プログラム2:キャッシュDBのデータを色々分析する中で必要なURLを見つけてばURLリストDBに格納する」
プログラム3:検索結果を出力

->これもありっておもってます。
 メリットとしては必要なURLだけアクセスすることで、
 サーバの負荷を減らせること。
 デメリットはURLのリストが小さくなってしまうこと。
 あとチューンアップとか速度とかの問題。
 ちなみに SEO Vertical Blog Search はこの形態です。

*補足1:プログラムとして他人のURLにアクセスすること が一番負荷が高く
自分のDBにアクセスしてURLをチェックすることと比べるとコストは何倍にもなります。
(俺の感覚ですがw)

*補足2:

3:WEBページを色々分析したい(インデクサ)

というのは極端な話、クロール最中にしてしまってもいいわけです。
=URLにアクセスしてURLリストを作りつつインデックスしてもいいわけです。
(つまり インデクサ+クローラー+スパイダーの1プログラム)
が これは一番効率が悪いので分割してると思われるわけです。

そういう意味で、キャッシュ というのは中間生成物なんですよね。(アーカイブとは違うわけです)
それを単にユーザにとって便利かもしれないということで、
YahooもGoogleも開示してるっていう。

プログラムが5こ?

当該のエントリーの引用元では5個のプログラムとなっていますが、
まあそれはないのかなーと思うので書きます。

上記の通りDBだけでも、
スパイダーが作ったURLリストDB
クロールしてキャッシュしたキャッシュDB
インデックスした後のインデックスDB
は必要なので、
DBもプログラムというなら5個以上になりますね。

ちなみにインデックスも仕方があって(これは長くなるので別エントリーにします)
ページ主体でインデックスする場合とワード主体でインデックスする場合で
DBの格納の仕方がかわるので、さらに増える可能性もありますね。
というかアメリカの人はDBをアプリというのか。。

おまけ

改めて気づいて考えてみると
なかなかおくが深いというかなんと言うか。

実際にGoogleが100%こうなっているとは思えませんが、
近いイメージなんではないでしょうか。

そうそう当たり前ですが、規模が小さい場合クローラとスパイダーを一緒にしてる場合が結構あります。
そういうのは結構出回っているので、自分で使ってみるのもいいかもしれませんね。
しかし、めちゃくちゃでかい(WEB全体とか)をやろうとおもったら、
分離しておくのが普通の発想なのかもしれません。
(というか普通のサーバじゃWEB全体をクロールとかむりだw)

ちなみに検索したらsouceforge にスパイダー+クローラーのPHPクラスがおいてありました。

http://sourceforge.net/projects/phpcrawl/

挙動は確認してません。

ってういか・・・

エントリー長すぎだしまとめるのが不能になった・・・


->