2011年11月29日火曜日

チェックボックスにプログラム(Ruby)で指定のものにチェックしてそのデータを取り出す方法ー後編

前回、チェックボックスにプログラムで指定のものにチェックしてそのデータを取り出す方法と書きながら全然載っていないじゃんと思ったあなた!
正しい。

さて、今回は本当にやります。ただ前回書いたようなライブラリがうまく導入されていないと動きませんので、
い、意味がないわけじゃないんだよ、引っかかったら前の投稿見て環境整えてちょ(はあと)

というわけで、

今日は後編です。

気を取り直して簡単な例で実装してみましょう。

サンプルプログラムを作って見ました。
以下のサイトにこんなアンケートを作ってみましたので、実行してみてください。
あなたの答えたアンケート結果は反映されましたでしょうか?
ちょっとむっとする答えが帰って来たら正解です。

さて、これをプログラムでやっちゃいましょう。

まず、ちゃんとデータを取ってこられるか確認しましょう。

require 'rubygems'
require 'mechanize'
require 'kconv'

agent = Mechanize.new

# サンプルクエッション
agent.get('http://maoringo.secret.jp/questionnaire.html')

p agent.page.body


いかがですか、面倒な感じのソースがダダダッと取得できましたでしょうか。
さて、本題チェックボックスに入れてみましょう。
では次に以下のプログラムを実行してみてください。

require 'rubygems'
require 'mechanize'
require 'kconv'

agent = Mechanize.new

#サンプルクエッション
agent.get('http://maoringo.secret.jp/questionnaire.html')
#上のhtmlのソースを見て 
のformを:name=>の中に入力 agent.page.form_with(:name => 'form1' ){|f| f.checkbox_with(:value => 'Apple').check # これもソース中ののvalueを入力 # f.checkbox_with(:text => /チェックボックス2/).uncheck # ちなみにuncheckも出来ます f.click_button#submitをクリック } p agent.page.body
どうです?結果がソースの形で表示されましたでしょうか?
本文中に解説は書いてしまいましたが、
お目当てのurlをagent.getに入れてお目当てのサイトのソースからformの名前を入れ
valueにチェックしたい項目の名前を入れるだけです。
(日本語に対応させたい場合は以下のサイトを参考にiconvをお入れ下さい)
詳しくはここに書きませんが、もちろん、:valueに他のものを入れることも出来ますし、
rubyのプログラムなので自分の持っているファイルから
当てはまるものをファイルから任意の文字列を取ってきてvalueに入れて
チェックすることも出来ます。
また、今回はチェックボックスを使用しましたが、目的のデータを取得するsearch
やファイルのアップロードや、リンク先をクリックしてページを遷移した先のデータを取得することも
可能です。
以下のサイトが詳しいっす。
http://w.livedoor.jp/ruby_mechanize/
質問、わかりにくい点ありましたら、お気軽にコメントオア@maoringoまでお尋ね下さい:-)

というわけで久々にプログラムっぽいこと書いたわけですが参考になれば幸いです。
他の言語だともっとあっさり出来たかも~と後から思ったけど、ま、いっか(・。・;

チェックボックスにプログラム(Ruby)で指定のものにチェックしてそのデータを取り出す方法ー前編


前編
チェックボックスを大量にクリックするはめになった私に @wakuteka よりMechanizeがあるよ☆彡
とのリプライをいただき、実装してみた試行錯誤してみたお話です。前編は導入編、
後編は簡単な実装編となっています。

チェックボックス、の前にRubyでWebサイトを解析する強力なライブラリ "Mechanize" の導入

基本的には以下のページで入れられます。なので、基本的には以下のページを参照してください。
ただ、私は自分の環境のせい(Window 32bit,Ruby 1.8.7,Cygwin) でいろいろひっかかったので、
似たような環境の方がいたら、参考になる情報も含んでいるかもしれません。
さて、導入編です。

最初導入なんかあっさり出来るんじゃん?って思っていました。

だって、インストール準備手順は(抜粋<引用>)
  1. Ruby 1.8.7 か 1.9.1 か 1.9.2 以降または Jruby を使う
  2. Mechanize が使用する nokogiri gem に必要な外部ライブラリ libxml2 と libxslt と iconv を yum や aptitude でインストールしておく
  3. Mechanize を gem install mechanize でインストール
Windows の場合は Nokogiri のバイナリパッケージとして関連外部ライブラリが一括インストールされるので、特になにもしなくて構いません。<引用終わり>



って書いてあるんだもの。

どこまでライブラリ入れてたか忘れたし、エラー見たほうがきっとはやいぞ、ってわけで

上記のページのサンプルプログラムを実行してみた。
require 'rubygems'
require 'mechanize'
require 'kconv'

agent = Mechanize.new
agent.get('http://www.google.co.jp/')
agent.page.form_with(:name => 'f'){|form|
  form.field_with(:name => 'q').value = 'Ruby'
  form.click_button
}
agent.page.link_with(:text => "オブジェクト指向スクリプト言語 Ruby".toutf8).click
puts agent.page.uri
puts agent.page.at('div#logo/img')['alt']
エラーがやっぱり出て、
 no such file to load -- rubygems (LoadError)
そうか、なかったですか。というわけで取り急ぎ入れる。

で、再度実行すると

/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:36:in `gem_original_require': no such file to load -- mechanize (LoadError)
        from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:36:in `require'
        from getget.rb:1

と言われちゃった。あ、そっかmechanize入れないとというわけで 実行してみたら・・・・
$ gem install mechanize
Building native extensions.  This could take a while...
     14 [main] ruby 9752 C:\cygwin\bin\ruby.exe: *** fatal error - unable to remap \\?\C:\cygwin\lib\ruby\1.8\i386-cygwin\etc.so to same address as parent: 0x90000 != 0x200000
Stack trace:
Frame     Function  Args
023FAEF8  6102796B  (023FAEF8, 00000000, 00000000, 00000000)
023FB1E8  6102796B  (6117EC60, 00008000, 00000000, 61180977)
023FC218  61004F1B  (611A7FAC, 61243584, 00090000, 00200000)
End of stack trace
・・・・

といったエラーが出る。

調べてみたら

rebase問題

Cygwin で Ruby のプログラムを動かしていると,
...
D:\cygwin\bin\ruby.exe: *** unable to remap D:\cygwin\bin\cygssl.dll to same address as parent(0xDF0000) != 0xE00000
...

みたいなメッセージが延々と出力されてどうしようもなくなることがあります.

$ rebaseall
というコマンドを実行してやると回避できます.
これはRubyだけで起こる問題ではなく,Cygwin fork() の問題だそうです

へー、というわけでrebaseallで回避。cygwinのバカっ><。

でまたgem install mechanizeをするとエラーが(・。・;

ERROR:  Error installing mechanize:
        ERROR: Failed to build gem native extension.

        /usr/bin/ruby.exe extconf.rb
checking for libxml/parser.h... no
-----
libxml2 is missing.  please visit http://nokogiri.org/tutorials/installing_nokogiri.html for help with           installing dependencies.
-----
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.



libxsltについても同様にエラーが出たのでcygwinからまたインストールする。

テストプログラムを再度実行
結果:

http://www.ruby-lang.org/ja/
Ruby - A Programmer's Best Friend
でけた・・・(く)