作りたいと思ったきっかけ
仕事上、更新情報やwebページの表記間違いを自動検知して、slackに通知出来たら便利だなあと思いクローラーを作ってみようと思いました。
また、最近、SEO関連の話を聞く事があり、Googleのクローラーを意識するようになった事が主なきっかけです。
長くなりそうなので、今回は、クローラーとは何かという事と大まかな仕組みについてのみ書きます。
Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例を参考にして地道に勉強していきます。
クローラーとは
クローラーとは、自動的にwebページを巡回して情報を収集するプログラムの事です。
一番有名なのは、Googleなどの検索エンジンのクローラーだと思いますが、これは自動でwebを巡回し、更新情報などを持ち帰りデータベース化します。
持ち帰ったデータを元にGoogle独自のアルゴリズムでランキングされ、検索結果ページに反映されます。
クローラーの仕組みを把握しよう
クローラーを作るには、webを巡回し、こちらが指定した条件に引っかかった文字列を取得する仕組みが必要です。
この仕組みを実現するには、htmlのページからString#scanを使用し、条件に指定した文字列を取得すれば実現出来ます。
ここでは、Rubyist Magazineの最新号のタイトルを取得するクローラーを想定して、機能の一部を作っていきましょう。
まず取得対象のRubyst Magazineのトップページをwget -O ruby_magazine.html https://magazine.rubyist.net/
でruby_magazine.html
という名前でローカルに保存してテストします。
今回は、データ取得だけなので問題ないと思いますが、クローラーの中には自動ログインしたり、パラメーターに値を入れて情報を収集するようなものもあります。
テスト状態でこいう事を行うとバグの原因になったりと迷惑をかける事になるので、良く理解するまでローカルもしくは、自分のサーバーでテストします。
では、まずtop_pageという変数にhtmlの中身をopenして入れます。
top_page = open("rubyist_magazine.html", &:read)
トップページの文字列が入ったtop_pageにtop_page.scanとしてテキストマイニングしていきます。
取得したい最新号の記述は下記のようになっています。
<ul>
<li><a href="./articles/prerubykaigi2019/preRubyKaigi2019-index.html">RubyKaigi 2019 直前特集号</a></li>
</ul>
このパターンにマッチする正規表現を書き、scanします。
latest_article = top_page.scan(%r!<ul>\n\s\s<li><a href="(.+?)">(.+?)</a></li>\n</ul>!)
正規表現にマッチした部分を出力してみましょう。
p latest_article
下記のような感じで出力されれば成功です!
[["./articles/prerubykaigi2019/preRubyKaigi2019-index.html", "RubyKaigi 2019 直前特集号"]]
例えば、こいつを定期的に起動してSlackに最新号を通知したりする事も出来そうですね。
最終目標は、webページ内の間違いやスパムを検知して通知する事ですが、まだよくわからないので、しばらく色々遊んでみよう。
書く事が溜まってきたら、次回も書きます!