またまた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/
挙動は確認してません。
ってういか・・・
エントリー長すぎだしまとめるのが不能になった・・・