RubyではWebサイト作成以外にも様々なシステム開発が可能ですが、Webスクレイピングに関しても簡単に実装することが可能です。
本記事では、Rubyでのスクレイピングに利用可能なライブラリ「Nokogiri」について、インストール方法から簡単な使い方までご紹介していきます。
Nokogiriについて
Nokogiriは、Rubyでスクレイピング処理を実装したい際に利用される代表的なライブラリです。
スクレイピングって何?
スクレイピングは、WebサイトからHTMLデータを抽出する技術で、特定の要素や画像などを抽出・加工することが出来ます。
具体的な利用用途としては、見出しだけを抽出して目次を作成したり、商品の価格や画像を抽出して一覧として加工するなど用途で利用されます。
Nokogiriのインストール方法
Nokogiriのインストールには、Rubyのパッケージ管理システムである「gem」のコマンドを利用して行います。
gem install nokogiri
権限周りのエラーが発生する場合「sudo」コマンドで実行してください。
sudo gem install nokogiri
インストールが完了していれば下記のコマンドでバージョン情報を確認出来ます。
nokogiri -v
NokogiriでRubyのスクレイピングを試してみよう
ではNokogiriを使っていくつか特定の要素を取得してみましょう。
タイトルを取得
タイトルタグは1つしか存在しないため下記のコードで取得出来ます。
require 'open-uri' require 'nokogiri' url = "https://style.potepan.com/" charset = nil html = open(url) do |f| charset = f.charset f.read end page = Nokogiri::HTML.parse(html, nil, charset) p page.search("title").text
実行した結果が下記です。
"働くエンジニアマガジン「ポテパンスタイル」"
サンプル解説
Nokogiriを利用したスクレイピングプログラムで必要なライブラリを読み込む必要があるため、下記の2つを定義します。
require 'open-uri' require 'nokogiri'
「open-url」は、URLへアクセスするためのライブラリで、「nokogiri」は先程ダウンロードしたスクレイピング用のライブラリです。
「open-url」は標準ライブラリなので、別途インストールする必要はありません。
html = open(url) do |f| charset = f.charset f.read end
サンプルでは一旦URLから文字コードとreadメソッドでHTML Bodyの情報を取得し、変数「html」へ格納しています。
page = Nokogiri::HTML.parse(html, nil, charset)
次に「parse」メソッドにより読み込んだHTMLの内容を解析してオブジェクトに変換しています。
p page.search("title").text
最後に、生成されたオブジェクトから「title」タグを検索し、テキスト部分だけを取得した上でコンソール出力を実行しています。
記事タイトルを取得
続いて実際にも需要がありそうな、トップページに表示されている記事のタイトルを取得するサンプルコードを記述してみましょう。
require 'open-uri' require 'nokogiri' url = "https://style.potepan.com/" charset = nil html = open(url) do |f| charset = f.charset f.read end page = Nokogiri::HTML.parse(html, nil, charset) page.xpath('//p[@class="topcontentsTitle"]').each do |content| p content.text end
実行結果が下記です。
"未経験からプログラマーを目指すために知っておくべき知識とは" "ブリッジSEとは一体どんな仕事なのか?求められるスキルやなり方を徹底解説!" "マークアップエンジニアとは?仕事内容や求められるスキルを徹底解説!" "ITストラテジスト試験とは|資格をとったらどんな仕事ができるの?" "気になるセキュリティエンジニアの仕事内容と年収とは?" "Java求人を探している方へ!最適な求人案件を見つけるための基礎知識" "サーバーエンジニアって?将来性とキャリアパスを徹底解説" "知っておきたい!ゲームプログラマーの将来性と年収相場とは" ....
サンプル解説
基本的な処理内容はページのタイトルを取得した際と変わりません。
今回は下記の部分で、pタグに設定された「topcontentsTitle」クラスの情報だけを取得し、記事タイトルを抽出しています。
page.xpath('//p[@class="topcontentsTitle"]').each do |content| p content.text end
記事のURLを取得
先程のサンプルでは記事タイトルを取得しましたが、記事のURLを取得するようなことも可能です。
require 'open-uri' require 'nokogiri' url = "https://style.potepan.com/" charset = nil html = open(url) do |f| charset = f.charset f.read end page = Nokogiri::HTML.parse(html, nil, charset) page.xpath('//div[@class="topcontentsIn"]').each do |content| p content.css('a').attribute('href').value end
実行結果が下記です。
"https://style.potepan.com/articles/9074.html" "https://style.potepan.com/articles/13124.html" "https://style.potepan.com/articles/9849.html" "https://style.potepan.com/articles/9591.html" "https://style.potepan.com/articles/9639.html" "https://style.potepan.com/articles/10251.html" "https://style.potepan.com/articles/9478.html" "https://style.potepan.com/articles/9510.html" ...
サンプル解説
今回のサンプルもHTMLを読み込んで解析を行うところまでは同じです。
今回は「div」タグに設定された「topcontentsIn」クラスの情報を取得し、取得した情報の中から「a」タグの「href」属性に設定されたリンク先のURLのみを抽出しコンソールに出力しています。
サンプルは記事執筆時点のものです。
URLの構造やクラス名が変更になった場合など、スクレイピングのコードを更新する必要があります。
さいごに: RubyでのスクレイピングならNokogiriを利用しよう
本記事では、Rubyでスクレイピングを行う際に代表的なライブラリ「Nokogiri」の使い方についてご紹介してきました。
今回のサンプルはあくまで簡易的なもので、対象ページのHTML構造を深く理解し、パターンを見つけることで様々なデータを取得することが可能となります。
まずは基本となる使い方を把握した上で、ご自身でも様々なサイトからデータ取得にチャレンジしてみてください。
gemコマンドは、Rubyのパッケージ管理システムのため、Rubyがインストールされていることが前提条件です。