【Ruby】Seleniumを使ったWebスクレイピングのサンプルコードを解説
RubyとSeleniumを使ってWebブラウザを自動操作し、Webスクレイピングを行う方法を解説します。開発環境の準備から、SeleniumとChromeDriverのインストール、そしてGoogle検索結果のタイトルとURLを取得する具体的なサンプルコードを通して、ブラウザの自動操作とWeb上の情報収集の基礎を学べます。
開発環境
- Ruby version: ruby 3.1.2
RubyのSeleniumとは
Selenium WebDriver(セレニウム ウェブドライバー)とは、私たちが普段インターネットを見るときに利用するWebブラウザを、プログラムを使って自動で操作するためのツールです。例えば、Webサイトのボタンをクリックしたり、文字を入力したり、ページを移動したりといった一連の操作を、人間が手動で行う代わりに、プログラムに任せることができます。
このツールは、人がブラウザを操作するのと同じように動作するため、Webサイトのさまざまな情報を効率的に取得する「スクレイピング」という作業にも非常に有効です。特に、JavaScriptというプログラム言語で動的に内容が変化するWebページ(例えば、ボタンを押すと新しい情報が表示されたり、時間とともに内容が更新されたりするページ)からでも、必要な情報を取得できるという特徴があります。通常のスクレイピングでは難しい、こうした動的なページのデータ収集も、Selenium WebDriverを使えば可能になります。
Rubyというプログラミング言語からSelenium WebDriverを利用するには、「selenium-webdriver」という名前のgem(ジェム)を使用します。gemとは、Rubyに機能を追加するためのライブラリのことで、これをインストールすることで、RubyのコードからWebブラウザを自動操作する命令を書けるようになります。
より詳しい情報や、具体的な使い方については、公式ドキュメントを参照することをおすすめします。 公式ドキュメント:https://www.selenium.dev/ja/documentation/
RubyのSeleniumの使い方
RubyのSeleniumの使い方を解説していきます。
Seleniumは、ウェブブラウザを自動で操作するためのツールです。システムエンジニアの業務では、ウェブアプリケーションの動作テストを自動化したり、ウェブサイトから特定の情報を自動で収集(スクレイピング)したりする際などに活用されます。 本記事では、Rubyというプログラミング言語を使ってSeleniumを導入し、基本的な準備を行う方法を解説します。
Seleniumをインストール
まずはSeleniumをインストールするために下記のコマンドを実行します。
RubyでSeleniumを利用するためには、まずselenium-webdriverというライブラリをインストールする必要があります。gemコマンドは、Rubyのライブラリ(Gemと呼ばれます)を管理・インストールするためのツールです。このコマンドを実行することで、Rubyのプログラムからウェブブラウザを操作するための機能が利用できるようになります。
1gem install selenium-webdriver
ChromeDriverのインストール
次にChromeDriverをダウンロードします。
Seleniumはウェブブラウザ自体を直接操作するのではなく、各ブラウザ専用の「ドライバー」を介して操作します。Google Chromeを操作する場合は、ChromeDriverというドライバーが必要になります。ご自身のChromeブラウザのバージョンに合ったChromeDriverを選ぶ必要があります。
ChromeDriverのダウンロードページ:https://developer.chrome.com/docs/chromedriver/downloads
Chromeのバージョン115以降を使用している場合は、Chrome for Testingの可用性ダッシュボードからダウンロードします。
Chromeのバージョン115以降をお使いの場合は、従来のChromeDriverのダウンロード方法とは異なり、Chrome for Testingという特別なバージョン管理システムからダウンロードする必要があります。上記のリンクからアクセスしてください。
Chrome for Testing:https://googlechromelabs.github.io/chrome-for-testing/
安定版の「Stable」を選択し、ご自身の環境に合ったプラットフォームのChromeDriverをダウンロードしてください。 今回はWindowsの64bitなので、「win64」のファイルをダウンロードしています。
「Stable」とは、最も安定していて一般的に推奨されるバージョンを指します。ご自身がお使いのPCのOS(Windows, macOS, Linuxなど)と、CPUのアーキテクチャ(64bitなど)に合ったファイルをダウンロードしてください。
ChromeDriverを適切な場所に移動
ダウンロードしたファイルを解凍し、chromedriver.exeを作業用のscrapingフォルダの中に配置します。
ダウンロードしたChromeDriverは、Rubyのプログラムがそのファイルを見つけられる場所に配置する必要があります。最も簡単な方法は、Rubyのプログラムファイルと同じディレクトリ(フォルダ)に配置することです。
Windowsの場合はchromedriver.exeですが、LinuxやMacの場合は拡張子のないchromedriverになります。
お使いのOSによって、ダウンロードされるChromeDriverのファイル名が異なりますのでご注意ください。
1scraping 2├── chromedriver.exe 3└── index.rb
この例は、scrapingというフォルダの中に、Rubyのプログラムファイルであるindex.rbと、ダウンロードしたchromedriver.exeを一緒に置く場合のファイル構成を示しています。これにより、index.rbがchromedriver.exeを簡単に見つけて利用できるようになります。
RubyのSeleniumでスクレイピングする
このセジュールでは、RubyのSeleniumライブラリを使ってWebサイトから情報を自動で収集する「スクレイピング」を行うサンプルコードについて解説していきます。Seleniumは、Webブラウザを自動で操作するためのツールで、これにより人間がブラウザで行うような操作(ページの開閉、文字入力、クリックなど)をプログラムから実行できます。
スクレイピングのサンプルコード
下記はSeleniumを使用してGoogleで「Rubyとは」と検索し、検索結果のタイトルとURLの一覧を取得するサンプルコードです。
1require 'selenium-webdriver' 2 3# ChromeDriverのパスを指定 (スクリプトと同じフォルダにある場合) 4service = Selenium::WebDriver::Service.chrome(path: './chromedriver.exe') 5 6# Chromeのドライバーを使用する設定 7options = Selenium::WebDriver::Chrome::Options.new 8driver = Selenium::WebDriver.for :chrome, options: options, service: service 9 10begin 11 # Googleのホームページを開く 12 driver.navigate.to 'https://www.google.com' 13 14 # 検索ボックスを見つける 15 search_box = driver.find_element(:name, 'q') 16 17 # "Rubyとは" を入力してEnterキーを押す 18 search_box.send_keys('Rubyとは', :enter) 19 20 # 検索結果が表示されるまで待機 21 wait = Selenium::WebDriver::Wait.new(timeout: 30) 22 wait.until { driver.find_element(:id, 'search') } 23 24 # 検索結果のリンク内にあるh3要素を取得 25 results = driver.find_elements(:css, '#search a h3') 26 27 results.each do |result| 28 # 親のaタグを取得 29 parent_link = result.find_element(xpath: './ancestor::a') 30 31 # タイトルとURLを取得(Rubyでは空の文字列も「真」とみなされるためemptyで判定する) 32 title = result.text 33 url = parent_link.attribute('href') 34 35 if !title.empty? && !url.empty? 36 puts "タイトル: #{title}" 37 puts "URL: #{url}" 38 puts 39 end 40 end 41 42ensure 43 # ドライバーを終了 44 driver.quit 45end
作成したファイルは、scrapingフォルダに移動して以下のコマンドで実行できます。
1ruby index.rb
ChromeDriverの設定をする
まず、このスクレイピングを行うためには、SeleniumがChromeブラウザを操作するための橋渡し役となる「ChromeDriver」というプログラムが必要です。このセクションでは、そのChromeDriverのパス指定と、Chromeブラウザを操作するための設定を行います。
1service = Selenium::WebDriver::Service.chrome(path: './chromedriver.exe') 2 3options = Selenium::WebDriver::Chrome::Options.new 4driver = Selenium::WebDriver.for :chrome, options: options, service: service
最初の行の require 'selenium-webdriver' は、RubyでSeleniumライブラリを使用するために必要なコードです。
Service.chrome の path には、ダウンロードして配置した chromedriver.exe のファイルパスを指定します。これにより、SeleniumがどのChromeDriverを使うべきかを知ることができます。
Chrome::Options.new では、Chromeブラウザを起動する際の詳細な設定(例えば、ヘッドレスモードで起動するなど)を行うためのオプションを作成します。ここでは特に設定を追加していないため、デフォルトの設定が使われます。
そして、Selenium::WebDriver.for で、実際にChromeブラウザを操作するための「ドライバー」というオブジェクトを作成しています。この driver オブジェクトを通じて、ブラウザへの指示をプログラムから送ることになります。
処理の終了時にドライバーを終了する
ブラウザの自動操作を行った後は、開いたブラウザを確実に閉じて、関連するプロセスを終了させることが大切です。
1begin 2 # スクレイピングの処理 3ensure 4 driver.quit 5end
begin から end までのブロック内でスクレイピングの処理を実行します。もしこの処理の途中で予期せぬエラーが発生した場合でも、ensure ブロック内のコードは必ず実行されるというRubyの特性を利用しています。
driver.quit は、作成したブラウザのドライバーを終了させ、開いたChromeブラウザのウィンドウを閉じます。これにより、プログラムが終了した後もブラウザが開きっぱなしになることを防ぎ、システムのリソースを適切に解放します。
Googleにアクセスしてキーワードを検索する
次に、実際のブラウザ操作として、Googleのホームページを開き、検索ボックスにキーワードを入力して検索を行う手順を見ていきましょう。
1driver.navigate.to 'https://www.google.com' 2 3search_box = driver.find_element(:name, 'q') 4search_box.send_keys('Rubyとは', :enter)
driver.navigate.to 'https://www.google.com' は、Webブラウザを指定したURL(この場合はGoogleのトップページ)に移動させる命令です。これにより、Chromeブラウザが自動的にGoogleのページを開きます。
次に、search_box = driver.find_element(:name, 'q') では、Googleのページ上にある「検索ボックス」を見つけ出しています。find_element は、指定した条件に合うHTML要素を1つだけ取得するメソッドです。
F12 キーを押してブラウザの開発者ツールを開き、Googleの検索ボックスを調べると、その要素には name="q" という属性が設定されていることが分かります。そのため、:name と 'q' を指定することで検索ボックスの要素を特定しています。
search_box.send_keys('Rubyとは', :enter) は、見つけた検索ボックスに「Rubyとは」という文字列を入力し、続けて Enter キーを押す操作をシミュレートしています。これにより、実際にGoogleで「Rubyとは」と検索するのと同じ動作が行われます。
検索結果が表示されるまで待機する
プログラムの実行速度は非常に速いですが、Webブラウザがページを読み込み、内容を表示するまでには少し時間がかかります。そのため、検索結果が表示される前に次の処理に進んでしまうと、必要な要素が見つからずにエラーになることがあります。この問題を解決するために、待機処理を導入します。
1wait = Selenium::WebDriver::Wait.new(timeout: 30) 2wait.until { driver.find_element(:id, 'search') }
wait = Selenium::WebDriver::Wait.new(timeout: 30) では、最大30秒間待機するという設定を持つ Wait オブジェクトを作成しています。
wait.until { driver.find_element(:id, 'search') } は、指定した条件が満たされるまで待機する命令です。ここでは、「id="search" というHTML要素が見つかるまで」という条件を設定しています。Googleの検索結果一覧は通常、id="search" という要素内に表示されるため、この要素が見つかるまでプログラムの実行を一時停止し、検索結果が完全に読み込まれるのを待っています。
検索結果のタイトルとURLを取得する
検索結果のページが表示されたら、そこから必要な情報であるタイトルとURLを抽出していきます。
1results = driver.find_elements(:css, '#search a h3') 2 3results.each do |result| 4 parent_link = result.find_element(xpath: './ancestor::a') 5 6 title = result.text 7 url = parent_link.attribute('href') 8 9 if !title.empty? && !url.empty? 10 puts "タイトル: #{title}" 11 puts "URL: #{url}" 12 puts 13 end 14end
results = driver.find_elements(:css, '#search a h3') では、検索結果の中から「タイトル」にあたるHTML要素を複数取得しています。find_elements は、指定した条件に合うHTML要素を全て取得するメソッドです。
:css はCSSセレクタという方法で要素を指定していることを意味します。'#search a h3' は、「id="search" という要素の中にある a タグの子孫要素である h3 タグ」を全て見つける、という指示になります。Googleの検索結果のタイトルは、通常この h3 タグ内に表示されています。
results.each do |result| ... end は、取得したそれぞれのタイトル要素(h3タグ)に対して繰り返し処理を行います。
ループの中で、parent_link = result.find_element(xpath: './ancestor::a') は、現在の h3 要素からその親要素を遡っていき、最も近い a タグ(リンクを表すタグ)を見つけ出しています。xpath: './ancestor::a' は、XPathというHTML要素の場所を指定する方法で、「現在の要素の祖先(親、祖父など)である a タグ」という意味になります。検索結果のタイトル(h3)は、そのリンク(aタグ)の中に含まれています。
title = result.text では、h3 要素の text メソッドを使って、要素に表示されているテキストコンテンツ(つまりタイトル)を取得しています。
url = parent_link.attribute('href') では、見つけ出した親の a タグの href 属性の値を取得しています。href 属性には、そのリンクが指し示すURLが格納されています。
最後に、if !title.empty? && !url.empty? という条件で、取得したタイトルとURLがどちらも空でないことを確認しています。Rubyでは空の文字列も「真(true)」とみなされるため、empty? メソッドを使って明示的に空かどうかを判定しています。
条件を満たす場合、puts メソッドを使って、ターミナル(コマンドプロンプトやターミナル画面)にタイトルとURLを出力します。
このコードを実行すると、自動的にChromeブラウザが起動し、Googleで検索が行われ、その後、ターミナル画面に検索結果のタイトルとURLが一覧で表示されることを確認できます。
おわりに
本記事では、RubyとSelenium WebDriverを用いてWebブラウザを自動操作し、Webスクレイピングを行う基礎を学びました。開発環境の準備として、Rubyのバージョン指定やselenium-webdriver gemのインストール、さらにChromeブラウザに対応するChromeDriverの配置方法を理解しました。Google検索結果からタイトルとURLを取得するサンプルコードを通して、ブラウザへのアクセス、要素の特定、テキストとURLの抽出といった具体的なWebスクレイピングの手順を実践しました。本記事で学んだブラウザ自動操作の知識は、動的なWebページからの情報収集や、システムテストの自動化など、今後のシステムエンジニアとしての業務で役立つでしょう。