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