RubyでWebスクレイピングしたい(ツール選定編)
自作したスクレイピングツールで画像をあつめたい
現在開発中のアプリケーションで、エフェクターボードの画像が100枚くらい欲しかったので、Google画像検索から画像を集めることにしました。
画像収集は機械学習などでかなり需要があるらしく、自作せずとも利用可能なツールがいくらかあるようです。
- GitHub - hardikvasa/google-images-download: Python Script to download hundreds of images from 'Google Images'. It is a ready-to-run code!
- 画像クローラー - Qiita
せっかくですが、rubyではWebスクレイピングするようなプログラムは書いたことがなかったので、自作してみることにしました。
nokogiriかSeleniumか
rubyでスクレイピングをする場合、nokogiriかSelenium(あるいはcapybara経由でSelenium)を使うのが主流です。
nokogiriは、HTMLのパーサーです。nokogiriを使う場合は、対象のページのHTMLタグを解析して、所望のデータを取得することになります。テキストデータとして解析するだけなので、JavaScriptなどは実行されません。
Seleniumは、rubyプログラムからブラウザを操作するためのライブラリです。こちらを使う場合、対象のページをブラウザで開いて、rubyプログラムからブラウザ経由で画面内に表示されている要素に対して操作、データ取得を行うことになります。
nokogiriの得意・不得意
- 得意
- seleniumを使う場合に比べて余計なことをしないので、高速に動作させられる
- 単純なページを簡単に解析できる
- 不得意
- 収集対象のデータがJavaScriptによって非同期でダウンロードされたり、動的にDOM要素が変化したりする場合、構造の解析が難しい。
Seleniumの得意・不得意
- 得意
- JavaScriptで動的に画面が動的に変化する場合でも、あまり大変な解析をせずに操作できる
- ブラウザで見た感じで操作する手順を記述していけばいいので、nokogiriを使う場合に比べてDOM構造への理解が少なくて済む
- 不得意
- ブラウザを起動させて操作するためにかなりリソースを使うので、高速には動作しない
Seleniumにする
最近はJSでゴリゴリ動的にDOM変化させたり、REST APIやGraph QL使って非同期でデータ取得するページが増えている気がするので、Seleniumを使うほうが簡単だと思います。 nokogiriを使ったさい、難読化されたJSを読む羽目になる未来が恐ろしい。
下記の記事では、instagramからnokogiriを使って画像収集ため、ページ閲覧中に発生するHTTPリクエストを解析して、効率的な画像収集の方法を発見しています。こんなかんじで解析できるのが理想的ではありますが、私レベルではこういう作業は答えが見つかるまでどれくらい時間がかかるか読めないので、なかなか手が出しにくい方法です。 Instagramから大量の画像を集める - Qiita
SeleniumとWebdriver
Seleniumを使う場合、操作したいブラウザのdriverが必要になります。 この辺ややこしいのですが、こちらの記事の図が非常にわかりやすいです。
入門、Selenium - Seleniumの仕組み | CodeGrid
Seleniumライブラリは、WebDriverの立ち上げと、WebDriverへのJSONの発行を行ってくれます。WebDriverは各ブラウザごとに用意されていて、基本的にOSごとのバイナリ実行ファイルを取得するかビルドしておく必要があります。
次はchromedriverをインストールして起動するところまで書きます。だいぶ進んでませんが、今日はこのへんで。