RubyでWebスクレイピング #1 はじめに

2 min read読了の目安(約1800字

#2 初めてのNokogiri

目的

RubyでWebスクレイピングをするぞ!と思って参考になる記事を検索してみると、open-uriでWebページにアクセスしてNokogiriでパースしてタイトルを取得して出力する、みたいな感じの記事がよくヒットする。もちろんこれは最初の一歩としてはとても大切なことだし、何も間違いではないが、RubyでWebスクレイピングをするぞ!と思った方で、ある特定のWebページのタイトルを取得して出力するのが目的という方はほとんどいないはずだ。
そこで、RubyでWebスクレイピングをする方法をもう少し掘り下げて解説し、本来の目的を達成する手助けになるような記事群を作成するのが目的。Webスクレイピングは全くの未経験の方も、前述のような記事を読んでタイトルを取得して出力するところまでやってみた方も、一連の記事群を読んで、Webスクレイピングに親しんでみてほしい。
私は3年半ぐらい主にRubyでWebスクレイピングをするお仕事をしていたが、1年ぐらい前に辞めてしまったので、その復習も兼ねている。むしろこっちの方が主目的かもしれない。週に1, 2記事の追加が目標。

環境

Ruby2.7系とMySQL5.7系を想定しているが、特にMySQLの方は気にしなくて良さそう。

一連の記事で解説すること

  • Ruby + Rubygems(Nokogiri, Mechanize, etc.)を用いたWebスクレイピングの方法
    特にMechanizeはかなり便利で、仕事でも相当使い倒していた自信があるため、なるべく詳しく解説する予定。

解説しないこと

  • 最近主流(?)のSelenium + Headless Chrome
    数年前まではJavaScriptにも対応したい場合、Capybara + Poltergeist + PhantomJSを使っていたが、Headless Chromeの登場を受けて、また、実質的に1人でメンテナンスを継続するのは困難とのことで、PhantomJSがアーカイブ化された。
    参考: GitHub phantomjs
    つまり現在はJavaScriptにも対応したい場合、Headless Chromeを使うのが筋になるのだが、こちらについては解説しない。理由は以下の通り。
    • 私が解説できるほどHeadless Chromeを使っていない(そこらの人よりは間違いなく使っているが)
    • 影響の大きいアップデートが割と頻繁にある(要出典)
    • Chromeを随時アップデートしているローカル環境で開発する場合、Chromeのバージョンが本番環境と食い違うことで余計なバグを生みがち
      本番環境と同じ開発環境があるのならこのデメリットは消える。
    • パーツが増えるため導入が面倒(導入が面倒なのはNokogiriにも同じことが言えるが)
    • よりシンプルな構成と比べて、マシンのリソースを食うし遅い
    • 普通にWebアクセスして落ちてくるhtmlに欲しい情報がない場合でも、ちょっと工夫すればopen-uriで十分なことが多い(この点についても後々解説する)
  • 法的なアレコレ
    個人的な利用からはみ出す、はみ出しそうな場合は、専門家に相談するべき。
  • 各種環境設定の方法
    ほとんどRubygemsなので大丈夫、という判断。Ruby on Railsを始める人が大抵引っかかるNokogiriの導入については、先人の知恵を借りること。

次回以降の予定

次回は、open-uriでWebページにアクセスしてhtmlを取得してそのhtmlをNokogiriでパースして必要な情報を取得する、という一連の流れをざっくりと解説する。
それ以降は、「Webアクセスによるコンテンツ(ほとんどの場合html)の取得」、「取得したコンテンツから必要な情報を切り出す作業」、「切り出した情報の保存」の3点を、きちんと区別して詳細に解説していく方針。Mechanizeの登場は結構先になりそう。

#2 初めてのNokogiri