私の歴史と今

振り返ると恥ずかしくなるのが私の歴史。だけどそのときは真面目に書いていた訳でね。そんな今の私を書いていく。

Rubyでブラウザ操作を擬似的に実現するHTTPクライアント(1)

HTTPテストと同じことをするわけだけど、テストではなく、あるルーチンワークをRubyで擬似的に実現させたい。
ブラウザ操作をそのまま自動化させたいのではないのが、私の今までの手法とは異なるところ。

Net::HTTPライブラリ

ruby http」で検索すると、Net::HTTPライブラリが存在することがわかる。
が、CookieやSessionはどうなるのか、疑問になる。

Cookieを生で

ruby http cookie」で検索し、HTTPヘッダーを生で扱わないといけないことを知る。
もっと高レベルのライブラリがあるはずだろ。

httpclient

ruby http client」で検索すると、httpclientというライブラリがあることがわかる。
FaradayやWWW::Mechanizeというライブラリもあるようだが、httpclientについて検索することにする。

ruby httpclient」で検索して簡単に使えることはわかったが、簡単にセッションを維持する方法がわからなかった。
(仕事でhttpclientを使ったことがあったのを思い出した)

キーワードを変えてみる。

ruby httpclient cookie」で検索してみたが、Cookieは手動で設定しないといけないようなことが書いてある。
別のライブラリの方がいいのかな。

WWW::Mechanize

httpclientはあきらめて、WWW::Mechanizeを調査することにする。
ruby WWW::Mechanize」で検索。スクレイピングライブラリになるそうだ。

httpclientよりもかなり進化していて、「ボタンを押す」という粒度でプログラミングできるようだ。
clickイベントハンドラが設定されていたら動くのかな。そのあたりの精度はわからない。

また、ここまでの機能を自分が必要としているかだが。。。

要件

  • クッキーは維持したい。
  • HTMLをパースして特定の値を抜き出したい。
  • CSVファイルをダウンロードしたい。

クッキーの維持が簡単であればhttpclientでいいが、面倒なのでMechanizeにしよう。
バグがありそうなので、クリック操作までは不要だけど。

WWW::Mechanize(再)

最新のバージョンをgemコマンドで確認してみる。

C:\Documents and Settings\june>gem list mechanize --remote

*** REMOTE GEMS ***

mechanize (2.5.1)
mechanize-content (0.1.2)
mechanize-downloader (0.0.1)
mechanize-model (0.0.1)
mechanize-ntlm (0.9.1)
mechanize-progressbar (0.2.0)
mechanize_clip (0.1.2)
mechanize_content (0.4.0)
mechanize_rspec (0.1.0)
mechanized_session (0.1.0)

ハイフン付きで色々あるようだけど、依存gemかな。それはさておき、最新は2.5.1ぽい。

ruby mechanize」で検索してみる。と、open-uriとnokogiriというライブラリがあることがわかった。
ruby open-uri」で検索してみたが、ftp用なのか? とにかく、APIを見て面倒だと感じるので却下。
ruby nokogiri」で検索すると、nokogiriがXMLとHTMLのパーサであることがわかった。
Net::HTTP、httpclient、open-uri などと一緒にnokogiriを使うってことになるのかな。

だけど、mechanizeはパーサも含んでいると書いてあったので、これはオールインワンになると理解した。
ということで、引き続き「ruby mechanize」を検索して用法を学ぶこととする。

GETと、それに続くPOSTは以下のようになるようだ。

# HTTPクライアント作成
client = Mechanize::new
 
# GETリクエスト
clinet.get('http://sample.com/')
 
# name="login"というフォームの中で、emailとパスワードを入力してPOSTリクエスト
client.page.form_with(:name => 'login'){|form|
  form.field_with(:name => 'user_mail').value = ’info@sample.com’
  form.field_with(:name => 'user_password').value = 'passwd'
  form.click_button
}

xxx_withとすると、引数に渡したハッシュに該当するDOMオブジェクトをを取得できるようだ。
form.click_buttonは、どのボタンを押したことになるのかな。
このあたりはAPIを読んでみるのが速いかも。

なお、Cookieは、Mechanizeが自動で管理してくれるようだ。だけど、JavaScriptで設定するようなものはダメっぽい。

次からコードを書きながらAPIを見てみよう。→ http://mechanize.rubyforge.org/

追記

トイレの中でiphoneを使って調べた。

  • バージョンの途中からライブラリ名の変更。WWW::Mechanize → Mechanize
  • Mechanizeの中ではNokogiriを使用している。


iphone5のサクサク感がたまらない!

おやすみなさい。