記事内にはプロモーションが含まれています

【Ruby】スクレイピングのやり方とライブラリ選定!Nokogiri・Selenium・Mechanizeを使いこなそう

【Ruby】スクレイピングのやり方とライブラリ選定!Nokogiri・Selenium・Mechanizeを使いこなそう Ruby

Web上の膨大なデータ収集や、競合サイトの調査、定型業務の自動化において、「スクレイピング」は非常に強力な手段です。

Rubyは、その記述のしやすさと豊富なライブラリ(Gem)のエコシステムにより、スクレイピングを行うのに適した言語の一つとして人気があります。

しかし、いざRubyでスクレイピングを始めようとすると、「NokogiriとSeleniumは何が違うの?」「JavaScriptで動くサイトが取得できない」といった壁にぶつかることも少なくありません。

この記事では、Rubyにおけるスクレイピングの主要なライブラリである NokogiriMechanizeSelenium の違いと使い分け、そして具体的な実装コードまでを最新情報に基づいて解説します。

目的に合ったツールを選び、効率的にデータを収集しましょう。

【本記事の信頼性】
プロフィール
執筆者:マヒロ
  • 執筆者は元エンジニア
  • SES⇒大手の社内SE⇒独立
  • 現在はこじんまりとしたプログラミングスクールを運営
  • モットーは「利他の精神」

Rubyでスクレイピングをするためのライブラリ3選

Rubyでスクレイピングを行う場合、主に以下の3つのライブラリ(Gem)が使われます。

取得したいサイトの構造や目的に応じて使い分けるのがポイントです。

  1. Nokogiri(ノコギリ):HTML/XMLの解析が得意。静的なページのデータ抽出に最適。
  2. Mechanize(メカナイズ):ログインやフォーム送信など、簡単なブラウザ操作が可能。
  3. Selenium WebDriver:本物のブラウザを自動操作する。JavaScriptで生成される動的なコンテンツに対応可能。

それぞれの特徴と実装方法を詳しく見ていきましょう。

1.静的ページならこれ!Nokogiriを使ったスクレイピング

ニュースサイトの記事タイトル一覧や、ブログの本文など、JavaScriptを使わずにHTMLだけで内容が完結している「静的なページ」のスクレイピングには、Nokogiriが最も高速で手軽です。

インストール

標準ライブラリではないため、Gemをインストールします。

gem install nokogiri

Nokogiriの基本的な使い方

Nokogiri単体ではWebページを取得する機能はないため、Ruby標準ライブラリの open-uri と組み合わせて使います。

以下は、指定したURLからHTMLを取得し、タイトルとh2タグのテキストを抽出するサンプルコードです。

require 'nokogiri'
require 'open-uri'

# スクレイピング対象のURL
url = '
Example Domain
(https://example.com)' # URLを開いてHTMLを取得し、Nokogiriでパース(解析)する # charsetはサイトに合わせて適切に設定してください(utf-8など) html = URI.open(url).read doc = Nokogiri::HTML.parse(html, nil, 'utf-8') # タイトルの取得 puts "タイトル: #{doc.title}" # h2タグの要素をすべて取得して表示 # cssメソッドやxpathメソッドを使って要素を指定できます doc.css('h2').each do |element| puts "見出し: #{element.text}" end

【ポイント】

  • URI.open でHTMLデータを取得します。
  • Nokogiri::HTML.parse でHTMLを解析可能なオブジェクトに変換します。
  • .css.xpath メソッドを使って、欲しい要素を特定します。

Nokogiriは処理が非常に高速ですが、JavaScriptによって後から描画されるコンテンツ(SPAなど)は取得できないという弱点があります。

2.ログインや画面遷移が必要ならMechanize

Mechanizeは、Webブラウザのような振る舞いをシミュレートするライブラリです。

Nokogiriの機能を含んでおり、Cookie(クッキー)の管理やリンクのクリック、フォームへの入力と送信といった操作が可能です。

インストール

gem install mechanize

Mechanizeでフォーム送信を行う例

例えば、検索フォームにキーワードを入力して送信し、結果ページのデータを取得するといった一連の流れを自動化できます。

require 'mechanize'

agent = Mechanize.new
agent.user_agent_alias = 'Mac Safari' # ユーザーエージェントの偽装も簡単

# サイトにアクセス
page = agent.get('
Example Domain
(https://example.com/search)') # フォームを特定する(例:1番目のフォーム) form = page.forms.first # フィールド名(name属性)を指定して値を入力 form.field_with(name: 'q').value = 'Ruby スクレイピング' # フォームを送信(検索ボタンをクリック) result_page = form.submit # 結果ページのタイトルを表示 puts result_page.title # 結果ページ内のリンクを表示 result_page.links.each do |link| puts link.text end

Mechanizeは「状態」を保持してくれるため、ログインが必要な会員制サイトの巡回などに威力を発揮します。
ただし、こちらもJavaScriptの実行には対応していません

3.JavaScript対応・動的サイトならSelenium WebDriver

最近のWebサイトは、ReactやVue.jsなどを使ってブラウザ上でHTMLを生成する「動的なページ」が増えています。
これらは、NokogiriやMechanizeでは中身が空っぽに見えてしまうことがあります。

そんな時に必須となるのが Selenium WebDriver です。

これはGoogle Chromeなどの実際のブラウザをプログラムから自動操作するため、JavaScriptが実行された後の「人間が見ているのと同じ画面」を取得できます。

環境構築(Chromeの場合)

Seleniumを使うには、ブラウザ本体と、それを操作するためのドライバが必要です。

  1. Google Chrome: ブラウザ本体をインストール。
  2. gem install selenium-webdriver: Ruby用ライブラリをインストール。

※以前は chromedriver を別途ダウンロードしてパスを通す必要がありましたが、Selenium 4.6以降は「Selenium Manager」機能により、ドライバの管理が自動化されました。

Seleniumで動的ページをスクレイピングする例

ブラウザをヘッドレスモード(画面を表示せずに実行)で起動し、動的に表示される要素を取得します。

require 'selenium-webdriver'

# Chromeのオプション設定
options = Selenium::WebDriver::Chrome::Options.new
options.add_argument('--headless') # ヘッドレスモード(画面を表示しない)
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')

# ブラウザを起動
driver = Selenium::WebDriver.for :chrome, options: options

begin
  # サイトにアクセス
  driver.navigate.to '
Example Domain
(https://example.com/dynamic_content)' # JavaScriptによる描画を待つ(例:特定の要素が表示されるまで最大10秒待機) wait = Selenium::WebDriver::Wait.new(timeout: 10) element = wait.until { driver.find_element(css: '.dynamic-text') } # テキストを取得して表示 puts element.text # スクリーンショットを撮ることも可能 driver.save_screenshot('screenshot.png') ensure # 処理が終わったら必ずブラウザを閉じる driver.quit end

ポイントとして、待機処理(Wait)が重要になります。
JavaScriptの読み込みには時間がかかるため、sleepwait.until を使って要素が表示されるのを待つ必要があります。

また、実際のブラウザを動かすため、Nokogiriなどに比べると処理速度は遅く、メモリ消費も大きいです。

スクレイピングを行う際の重要な注意点とマナー

スクレイピングは便利な反面、相手のサーバーに負荷をかけたり、法的トラブルに発展したりするリスクがあります。

以下のルールを必ず守りましょう。

サーバーへのアクセス頻度を制限する(sleepを入れる)

短時間に大量のリクエストを送ると、DoS攻撃とみなされてアクセス禁止になったり、相手のサーバーをダウンさせてしまったりする可能性があります。

ループ処理の中には必ず sleep 1 (1秒待機)などを入れ、アクセス間隔を空けるようにしてください。

urls.each do |url|
  # スクレイピング処理...
  
  sleep 1 # 1秒待機するマナー
end

robots.txt を確認する

Webサイトには、クローラー(スクレイピングプログラム)のアクセス許可・拒否を指定する robots.txt というファイルが設置されていることがあります(例: https://example.com/robots.txt)。

ここで Disallow 指定されているパスへのアクセスは避けましょう。

利用規約と著作権を守る

サイトの利用規約でスクレイピングが明示的に禁止されている場合、それを行うと規約違反(偽計業務妨害など)に問われる可能性があります。

また、取得したデータ(文章や画像)を自分のサイトで公開したり販売したりすることは、著作権法違反になるケースが多いです。

あくまで「私的利用」や「データ解析」の範囲に留めましょう。

Rubyのスキルを活かして年収を上げる方法

以上、Rubyでスクレイピングをする方法について解説してきました。

なお、Rubyのスキルがある場合には、「転職して年収をアップさせる」「副業で稼ぐ」といった方法を検討するのがおすすめです。

Rubyエンジニアの年収や単価は高い傾向にあるため、転職によって数十万円の年収アップはザラで、100万円以上年収が上がることも珍しくありません。

なお、転職によって年収を上げたい場合は、エンジニア専門の転職エージェントサービスを利用するのが最適です。

今すぐ転職する気がなくとも、とりあえず転職エージェントに無料登録しておくだけで、スカウトが届いたり、思わぬ好待遇の求人情報が送られてきたりするというメリットがあります。

併せて、副業案件を獲得できるエージェントにも登録しておくと、空いている時間を活かして稼げるようなRubyの案件を探しやすくなります。

転職エージェントも副業エージェントも、登録・利用は完全無料なので、どんな求人や副業案件があるのか気になる方は、気軽に利用してみるとよいでしょう。