Railsで使えるGem

Rubyでウェブサイトを操作してリストをつくる〜mechanize

投稿日:2012年9月12日 更新日:

 

 

 

以前からRailscastsというRuby on Railsの動画サイトが好きでよく見ているのだが、380近く動画があって気になったものから見ているので、どれをみたのかわからなくなってきた

そこで、mechanizeというruby gemをつかって動画のリストを取得してチェックリストを作ることにした

mechanizeは、指定したウェブサイトの要素を分析して、フォームに必要な事項を入力して、クリックだとか、その結果のうち、div#resultに書かれている要素を抜き出すだとかいうことをしてくれる

参考

railscasts.com/episodes/191-mechanize

mechanize.rubyforge.org/GUIDE_rdoc.html

インストール

準備

おそらくcapybaraをインストールしていればすでに導入済みだと思うが、必要なライブラリを用意する

gem

コンソールで試す

pryのインストール

*irbはコンソールでrubyを実行する環境だけど、pryの方が高性能なのでpryが使えたら使ったほうがいい

 最初の一歩

やっていることは

[1] mechanizeライブラリを使うことを宣言

[2] 空のMechanizeオブジェクトを準備

[3]ウェブサイトを指定して内容を取得する

内容はagent.page.rootにはいる

pryであれば色付きで内容が表示される

いろいろ試す

試しに、title要素を取得してみる

そこから、textを取り出せばウェブサイトのtitle要素のテキストを取得できる

 

対象のウェブサイトの調査

あとは、その要領で必要な要素のテキストを取得すればいい

 

要素はFirefoxの「要素を調査」などで調べられる

おすすめはhttp://www.selectorgadget.com/のブックマークレットを使うことだ

 

ちなみに、Railscastsのサイトでは一つのエピソードごとにだいたい次のような要素が設定されていた

  •   div.number ナンバー
  •   div.published_at 投稿日
  •   a コメント
  •   h2 タイトル
  •   div.description 説明
  •   span.stats 時間(分)
  •   .watch ビデオへのリンク

そして、次のページへのリンクは「.next_page」が設定されていて、最終ページではこれが「.next_page.disabled」になることがわかった

試しにさっきのページのエピソードの最初の要素を取ると

ここから例えば動画のタイトルをとるには

h2要素を選んでテキストを取ればOK

リンクをクリックするにはクラスを探してクリックすればよい

そうするとagent.pageの内容がクリックしたページのものに書き換わっているのがわかる

今のURIを調べるには

最初に 43ページ目を指定したのが、previous_pageをクリックしたので42ページ目になっているのがわかる

あとは、これをまとめてテスト用のスクリプトに書き出せばOK

ループとかがよくわからないからカッコ悪いけど動いたのでよしとする

最初の一回を読んでからクリックを始めると、最後のページで余分にクリックしてエラーが出るか、最後のページを読み込まないんだよな・・・

*多用するとウェブサイトに迷惑がかかるので注意!!

これを実行すれば一覧表が得られる

あとは煮るなり焼くなり

 

実はこれすんなり動いたわけではなくて、色々と調べないとエラーがすぐ出てしまう

コンソールで試しながらやるのがいいと思う

また日本語はエンコードという難問があって自分のこのブログはまだ表示できずにいる

RubyのMechanizeで文字化けするページがある件について

 

公式サンプルを改良したもの

 

 

-Railsで使えるGem
-,

執筆者:

関連記事

連続的な位置情報の取得とHerokuへのアップ~HTML5 Geolocation API

  目次1 連続的な位置情報の取得2 heroku3 結果 連続的な位置情報の取得 連続的な位置情報の取得はこんなかんじで書いてみた [crayon-5a17c94da9d7d4055440 …

no image

Rails3.2とBackbone.jsでToDoアプリを作ってみた~backbone-on-rails

  公式 backbonejs.org/ Backbone ドキュメント日本語訳 github.com/enja-oss/Backbone イントロダクション github.com/enja

no image

Railsで動画を管理する2 動画のサムネイルを作成する~CarrierWave + Flowplayer

  *とりあえず動いているけど、もっとましな方法があるとおもいます 前提 Railsで動画ファイルを管理する~CarrierWave Flowplayer 参考 Rubyでffmpegのラッ …

Rails3.2で位置情報を日本語表示の住所に変換する~geocoder

ついにブログ記事が100件突破した! そのうちメニュー項目などをわかりやすく構成し直したいと思う いまはRailsのプログラムが楽しくて仕方ない時期なので色々と試して書き溜めたいと思う EverNot …

no image

Mongoidで地理情報インデックスを使おうとしたけどうまくいかない

試したgem mongoid_geo mongoid_geospatial 試してないgem mongoid_spacial