- blogs:
- cles::blog

JavaScriptバリバリのページをスクレイピングする


普段ウェブのスクレイピングにはWWW::Mechanizeを使っています。WWW::MechanizeはJavaScriptが解釈できないので、これまでは自分でJavaScriptを解釈してプログラミングをしていたのですが、スクレイピングの妨害のためなのか何なのかは良くわかりませんが、尋常じゃない程のJavaScriptを解釈しなければならないページにぶち当たってしまって、この一週間途方に暮れていました。
いろいろ調べた結果、IEやFirefoxを外部から操作する方法が一番早いようなので、Rubyから使えるWatirというライブラリを使ってみることにしました。内部的にはWin32APIを使ってIEをコントロールするようです。後々バッチ化をすることを考えると、あまりWindows依存で起動時に画面が必要になるアプリにはしたくないのですが、この際ですから仕方ありません。
Watir is an open-source library for automating web browsers. It allows you to write tests that are easy to read and maintain. It is simple and flexible.
Watir drives browsers the same way people do. It clicks links, fills in forms, presses buttons. Watir also checks results, such as whether expected text appears on the page.
このWatir、何と読んだらいいから分からなくて困りましたが、Watir pronounceで検索してみたらプロジェクトのトップページに"It is pronounced water."とちゃんと書いてありました。ウォーターと読めばいいようです。
† Cygwinではインストールできないらしい
インストールはプロジェクトのインストールの解説ページにあるとおり、RubyをOne-Click Installerを使ってインストールし、コマンドプロンプトから下記のgemコマンドを使うだけです。One-Click Installerのインストール時のオプションでgemを使えるようにしておけばいいと思います。
結論から言うとこれだけなのですが、現状ではWatirはmswin32版を使わないとうまくインストールできないようです。CygwinのRubyにはgemでインストールされるライブラリのいくつかが対応していないらしくインストールできませんでした。余計な苦労をしたくないのであれば、プロジェクトのインストールの解説通りにセットアップするのが無難です。
† 肩慣らしには
とりあえずこんなスクリプトを実行してみてGoogleでhogeが検索されるところをみてみましょう。
ライブラリの概要を掴むにはチートシートとWatirのメソッドとHTMLタグの対応表を印刷して手元に置いてから、チュートリアルを攻略するのが良さそうです。
† いろいろとクセもある
個人のIEの設定に結構依存するようで、予期しないところでポップアップが出たりすると、そこで処理が止まってしまったりするというのが頻繁にありました。そのあたりをどうするかも頭が痛そうです。実行用にVMWareか何かでポータブルな環境を作ってしまった方がいいかもしれません。
XPathでタグを検索しようとすると、内部でREXMLを使っているのでwell-formedでないHTMLを解析させようとするとREXMLが例外を吐いてしまいます。これについてはhtmlをHpricotで処理させることで回避しましたが、正直もうちょっと楽がしたいです。
今回はファイルのダウンロードがあるので、ファイルの保存ダイアログを操作する必要がありました。この方法についてはチュートリアルにも解説があり、AutoItというライブラリを使ってやっているのですが、日本語版のWindowsだとうまく動かないことがあるので細かいところでいろいろと工夫が必要でした。
要素をクリックするメソッドが3つあり、その違いが書いてあるドキュメントが見つけられなくて、その使い分けに苦労しました。とりあえずソースをみた感じではそれぞれ下記のような感じのようです。
ie.click → クリックして、読み込み終わるまで待つ
ie.click! → クリックして、読み込み終わるまで待たない
ie.click_no_wait → 違うプロセスを起動してクリックする(読み込み終わるまで待たない)
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/2849
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。
OpenID を使ってログインすることができます。
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(112131)
3 . 年次の人間ドックへ(111621)
4 . 2023 年分の確定申告完了!(1つめ)(111206)
5 . 三菱鉛筆がラミーを買収(111104)