勝手に答えるシリーズ 「大規模なクローリングの仕組みについて」

Pocket
LINEで送る
GREE にシェア
LinkedIn にシェア

こんにちわ。
 

小学校の頃に地元の水泳大会で賞をもらった時の種目が「クロール(自由形)」だった、下駄です。
 

今でも、スポーツジムなどのプールで泳ぐ時は、だいたいの人をごぼう抜きするんですが、先日、中学で水泳部の息子に、アホみたいに抜かれました。
 

息子よ、親父を超えて行きやがったな。
 

そんなワケで、今回は、「クローリング」のアルゴリズムに関する質問で人気がなかったものがあったので、ピックアップしてみました。

今回のお悩み相談内容

https://teratail.com/questions/192212
 

「Indeedなど横断検索サービスのクローリングについて」
 

サービス名を名指ししていて、すこし危険な書き込みかと思ったんですが、自分的にもちゃんと考えておきたかった内容だったので取り上げてみます。
 

質問の内容は、
 

大規模なクローリングの仕組みについて質問です。
(エンジニアリングに疎いため拙い質問で恐れ入ります。)
各社のサイトから求人情報をクローリングする求人検索エンジンIndeedを例に挙げます。

Indeedに自社サイトをクローリングしてもらうための条件の一つに「HTML形式の求人情報であること」とあり、それを満たせば(他にも条件はありますが)クローリングをしてくれるようなのですが、各サイトごとにページの構造や要素が違うのに、どうやって情報を取得しているのかが気になりました。

そこで質問なのですが、ページ構造や要素が違う複数のサイトでもクローリングは可能なのでしょうか?
(1つ、2つのサイトであればそれぞれに適したクローラーを用意すればできるのではと思うのですが、ここでは数十万サイトをクローリングすると仮定します。)

できるとしたらそれはどのように行うのでしょうか?
※Indeedが行なっている方法は明らかになっていないと思うので一般的な技術例を教えていただきたいです。

 

要約すると、2つの質問があり、
 

1. ページ構造の違うサイトを情報をクローリングして情報をまとめることは可能なのか?
2. できるとしたら、その方法の一般的な技術例。

という感じですね。
 

解答のための考察

一般的には、公開サイトから、htmlソースコードを取得するだけの事を「クローリング」と言い、取得したHTMLから、任意の情報を抜き出すことを「スクレイピング」と言われています。
 

今回の質問は、クローリングではなく、スクレイピングする方法を聞いているんだと思いますが、
 

標準的なスクレイピングは、HTMLのDOM構造の任意箇所の文字列を取得するという事で、twitterやfacebookのogpなどのサイトのサムネイル画像を表示したり、サイトタイトルを表示するのも、同じスクレイピング技術と言えるでしょう。
 

ただ、2つ目の質問として、世の中のインターネットで見るwebページで同じDOM構造のWEBサイトは、ほぼ無いと考えられるので、どうすれば一定の情報をスクレイピングすることができるのか?という点ですね。
 

スクレイピング考察 #1アルゴリズム対応

方法はざっくり2つほど考えられるのですが、
 

1つ目は、ページ内の色々な箇所の文章やタグ構成などを、ある程度読み解くアルゴリズムまたは、AIエンジン的な解析システムを作ってそれにマッチするサイトの情報を読み込みます。
 

もちろん、すべてのwebサイトに適応できるわけではなく、AIエンジンと初心者の人が聞くと、少し腰が引けてしまうのも分かります。
 

簡単にアルゴリズムを組みたければ、ページ内に書かれている単語が、取得したい情報のワードグループに含まれているかどうか、
 

また、そのキーワードが、tableなどで、情報マトリクス化されているか?
 

そうした内容を正規表現を使って行うと、精度の問題はともかく、マッチさせることは不可能ではないでしょう。
 

スクレイピング考察 #2テンプレート対応

そして、2つ目は、スクレイピングを見境なく行うのではなく、クローリングするURL(またはサイト)に対しての、DOM構造をテンプレートとして、事前に作っておいて、それを元に、必要箇所を取得するという方法。
 

この際のデメリットは、テンプレートをurlまたはサイト毎に作らなければいけないというコトです。
 

そして、そのサイトで、構成変更があった場合は、そのテンプレートがゴミ化してしまうという感じですね。
 

でも、メリットを考えると、そのサイトで確実に情報を取得できるという事が担保できるようになります。
 

オススメはハイブリッド

他にもいくつか方法は考えられますが、この2つの方法を組み合わせて運用するのが一番のおすすめになります。
 

実際に僕がやるとしたら、無作為なURLからhtmlソースをクローリングして、吸い出せるだけの情報をスクレイピングする、標準アルゴリズムを作ってみて、
 

その結果をデータベースに入れてみると、虫食いのような状態で、データが吸い出せ方どうかが判断できると思います。
 

その取得できなかった情報をURLをキーとしたテンプレートとして、設置できる機能をつけて、取得されたHTMLを再スクレイピングすることで情報を補完する。
 

テンプレートが作られたURLは、次回クローリングからは、ほぼ完璧な情報取得が一発で行えるようになります。
 

アプリ構築1回で完璧なスクレイピングシステムをつくるというよりは、定期運用を考えた、積み上げ型のシステムを作ったほうがいいと思いますね。
 

最後に

サイトに寄っては、クローリング禁止という規定を持っている企業サービスなども数多くあるので、そうした規約違反にならないように、robots.txtをキチンと認識したり、
 

規約違反にならないための各種の確認も、念入りに行うようにしましょう。
 

規約情報をクローリングしようなどと考えると本末転倒になるので、気をつけましょうね。

Leave a Reply

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です