Rubyでクローラー入門。JSなど、IT関連の記事を書いていますRubyPython子育て機械学習2017-08-24Rubyでクローラー入門。RubyTweetはじめにこんにちは、rubyエンジニアのさもです。本記事では、rubyで簡単にクローラが作れるよというのを紹介したいと思います。ruby入門者や、rubyを勉強したけど何ができるのと思っている方、ruby=railsと思っている方、クローラをやってみたいけど実際どうすればいいか分からない方へ、rubyでこんなこともできるんだ、クローラってこんな感じでいいんだ、と思っていただけたら幸いです。今回実装するクローラでは、ruby標準のライブラリしか使いません。外部ライブラリのインストールではまって、本来やりたいことができなくなることを極力避けるためです。最後に準備いくつか準備が必要になります。index.html.erbになります。今回は、結果をグラフで表示したいので、c3.jsというjsライブラリを使って、ブラウザ上にグラフを表示させたいと思います。以前c3.jsの入門記事を書いたので、そちらを参考にしてください。ダウンロードだけなので一瞬で終わりますwww.uosansatox.biz普通にダウンロードしてくるだけですが、d3だけバージョンに注意です。d3がv4系だとたぶん動かないです。rubyのインストール著者が使用したrubyのバージョンは2.2.3でした。今回は特にバージョンを気にすることもないと思うので、お好きなバージョンでお試しくださいインストールは以下のサイトに丸投げしてしまいます。後で実装していくので今は中身が空っぽのファイルを作っておいてください。ファイル名はindex.html.erbです。拡張子は、.htmlじゃなくて、.html.erbです。rubyファイルの準備こちらも後で実装していくので空っぽのファイルを作っておいてください。ファイル名はhatena.rbとか、何でもいいです。入れておいてください。実装hatena.rbの実装クローラの本体です。以下のコードをhatena.rbへコピペしてください。次へリンクが見つかればurlをセット。file.puts(ERB.new(File.read(erb_file)).result(binding))end解説していきます。動かしたいという方は、次のindex.html.erbをコピペして、実行まで進んでください。必要なライブラリを読み込むerbはhtmlのコードの中にrubyコードを埋め込み、動的にファイルを生成するためのライブラリです。html以外でもいけます!すごい!open-uriはファイルを開くメソッドopenをuriにも対応させたものです。robotexはrobot.txtを読み、クローラ可能かどうかを判定するのに使います。クローラしないでというページはクローラしません。実行時引数にはてなブログのURLを渡す実行時引数にサイトURLの文字列を渡すことで、実行時にクローラ対象を変更できるようにしています。基本動作としています。最後のページには次へリンクがないので、last_pageをtrueにし、クローラを終了させます。robots.txtを確認するRobotexのallowed?メソッドでクローラOKかどうかをみて、OKならクローラを実行させます。NGならクローラを実行させません。クローラOKかつ、最後のページでない限り、クローラを続けます。urlからページをダウンロードopenメソッドはopen-uriによって提供されているメソッドです。サイトのURLを渡すことで、ダウンロードし、ファイルのように扱えます。ページ内の記事投稿日一覧を正規表現で取得このコードの要となる部分です。scanメソッドに正規表現を渡すことで、文字列全体から一致するものを配列形式で受け取れます。ページ下段にある次へリンクを正規表現で取得ページ内の日付をすべて収集したあとで、次のページへリンクを探します。見つかればそのリンク先をhatena_url変数へ代入します。見つからなければ、そのページで最後ということなのでlast_pageフラグを立てます。サーバに負荷がかからないように、次のリクエストを投げるまで4秒待つ優しさの1行です。プログラムから高速に連続してアクセスすると、サーバに負荷がかかってしまいます。そのため少し待機します。c3.js用にデータを加工する収集したデータを並べ替えたり、ユニークにしたり、ラベルをつけたり、c3.jsでグラフを表示するためのデータを作ります。@date_count_valuesが各日付に何件投稿したのかが、配列形式で入っています。@durationが投稿した日付の一覧です。作成したデータをindex.html.erbへ埋め込み、index.htmlを動的に作成します。index.html.erbの実装クローラの実行結果を表示させるためのhtmlファイルを作成します。以下のコードをindex.html.erbへコピペしてください。みていただきたいです。c3.jsの記事で言及していないところを解説します。'x'で'x'というラベルのついたデータをx軸にします。‘x'ラベルは投稿した日付の配列につけています。%>~の部分にrubyのコードを埋め込めることができます。埋め込んだrubyコードの実行結果をその部分へ置き換えるという意味になります。%>だけだと、実行されるだけで表示されません。axisaxisは軸に関するあれこれを設定していく部分です。'timeseries'は、x軸が日時であらわされていますよという設定です。tickはx軸に表示されるラベルやメモリの設定です。fitをtrueに設定すると、日付に抜けがあってもいい感じに調整してくれます。formatはx軸に表示されるメモリの表示形式を指定します。'%Y-%m-%d'にすると、年-月-日の形式で表示してくれます実行さて、実装も終わったので、そろそろ実行しましょう。以下のコマンドを、rubyが実行できるプロンプト等で実行します。http://www.uosansatox.biz/しばらく実行経過を見守っていると、作業フォルダにindex.htmlファイルが作成されたと思います。index.htmlをブラウザを開くと以下のようなグラフが表示されます。作ってしばらく放置して、ある時突然はまり出した感がお分かりになったでしょうか。最後にうまく実行できたでしょうか。日付が詰まりすぎていて少し見にくいですね。c3.jsには表示するメモリを制限するオプションもあるので、もっと綺麗にできると思います。その他、プログラムに問題があれば教えてください。hatena.rbのコメントと、空白行を全て消すと、30行です。意外と少ない行数でクローラが作れてしまいました。結果をerb経由で渡して、ブラウザで"でーたびゅじゅあらいぜーしょん"できるのはカッコいいですよね。何か面白いクローラができたら記事を書いてみたいと思います。14:20Rubyでクローラー入門。Rubyの勉強メモです。使えばいいのかわからない...2018-06-26Rubyをもう一歩進んで勉強する3章(Perl風機能の排除)第3章はRubyに残っているPerl風機能を排除(できるだけ使わな...2017-12-26Lineにアップロードした画像をクラウドへ保存するBot作ったこんにちは、エンジニアのさもです。タイトルにもありますが、...2017-11-30Rubyでどう書く?配列からターゲットの周囲5件を抜き出すこんにちは、エンジニアのさもです。仕事で次のような要件のメ...2017-11-16Rails入門者のためのQA~勉強方法~こんにちは、エンジニアのさもです。»さもしのプロフィールRubyを使うWebエンジニアです。仕事の幅を広げようとPHPも勉強します。趣味でProcessing(p5.js)をやっていて、入門サイトを作りました。当サイトに掲載されている広告について当サイトでは、第三者配信の広告サービスGoogleAdsenseを利用しています。使用することがあります。Googleアドセンスに関して、このプロセスの詳細やこのような情報が広告配信事業者に使用されないようにする方法については、こちらをクリックしてください。当サイトでは、Googleによるアクセス解析ツール「Googleアナリティクス」を利用しています。このGoogleアナリティクスはトラフィックデータの収集のためにCookieを使用しています。このトラフィックデータは匿名で収集されており、個人を特定するものではありません。この機能はCookieを無効にすることで収集を拒否することが出来ますので、お使いのブラウザの設定をご確認ください。当サイトでは、スパム・荒らしへの対応として、コメントの際に使用されたIPアドレスを記録しています。これはブログの標準機能としてサポートされている機能で、スパム・荒らしへの対応以外にこのIPアドレスを使用することはありません。メールアドレスとURLの入力に関しては、任意となっております。全てのコメントはサイト管理人が事前にその内容を確認し、承認した上での掲載となりますことをあらかじめご了承下さい。加えて、次の各号に掲げる内容を含むコメントは管理人の裁量によって承認せず、削除する事があります。特定の自然人または法人を誹謗し、中傷するもの。極度にわいせつな内容を含むもの。禁制品の取引に関するものや、他者を害する行為の依頼など、法律によって禁止されている物品、行為の依頼や斡旋などに関するもの。その他、公序良俗に反し、または管理人によって承認すべきでないと認められるもの。さもし初出掲載:2017年8月24日はてなブログをはじめよう!s-uotani-zetakansuさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。