Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【Ruby】Nokogiriを使ったWebスクレイピングのサンプルコードを解説

RubyのNokogiriライブラリを使ったWebスクレイピングの入門記事です。Webサイトから特定の情報を自動で集める方法について、開発環境の準備から、Nokogiriのインストール、そして実際のサンプルコードでGoogle検索結果のタイトルとURLを抽出する具体的な手順まで、システムエンジニアの初心者にも分かりやすく解説します。

作成日: 更新日:

開発環境

  • Ruby version: ruby 3.1.2

RubyのNokogiriとは

Nokogiri(ノコギリ)は、Rubyというプログラミング言語で利用できるライブラリです。これは、ウェブページの構造を示すHTMLや、情報を整理するためのXMLといったドキュメントを「解析」するためのツールです。

「解析」とは、複雑なHTMLやXMLのデータの中から、コンピューターが理解しやすいように、その構造や含まれる要素(見出し、段落、リンク、画像など)を細かく分解し、整理することを指します。

この機能により、NokogiriはRubyでの「スクレイピング」という技術に広く使われています。スクレイピングとは、ウェブサイトから特定の情報を自動的に集めることですが、Nokogiriを使うことで、HTMLやXMLドキュメントの中から目的の「要素を検索」し、その要素に含まれる「データを抽出」することが簡単に行えます。たとえば、あるECサイトから特定の商品名や価格だけを取り出したい場合に、Nokogiriがその作業を効率的にサポートします。

公式ドキュメント:https://nokogiri.org/

RubyのNokogiriの使い方

RubyのNokogiriは、WebサイトのHTMLやXMLといったデータを効率的に扱えるようにするためのライブラリです。Webページの内容を読み込んで、そこから特定の情報を取得したり、データの構造を解析したりする際に非常に役立ちます。システムエンジニアにとって、Web上のデータを扱う作業は多いため、Nokogiriのようなツールは非常に重要になります。このセクションでは、RubyでNokogiriを使うための基本的な方法について解説していきます。

Nokogiriをインストール

Nokogiriを利用するには、まずご自身の開発環境にNokogiriライブラリをインストールする必要があります。Nokogiriをインストールするには、Rubyに標準で付属しているgemコマンドを使用します。gemコマンドは、Rubyのプログラムで利用できる便利なツール(ライブラリ)を管理するためのコマンドです。

以下のコマンドをターミナルまたはコマンドプロンプトで実行してください。

1gem install nokogiri

このコマンドを実行することで、Nokogiriライブラリがお客様の環境に導入され、Rubyのプログラムから利用できるようになります。これでNokogiriを使用するための準備は完了です。

RubyのNokogiriでスクレイピングする

システムエンジニアを目指す上で、Webサイトから情報を自動的に集める「スクレイピング」は非常に役立つ技術の一つです。スクレイピングとは、Webページにアクセスして、そのページのHTMLデータから必要な情報を抽出するプログラミング手法のことです。Rubyでは「Nokogiri(ノコギリ)」というライブラリを使うと、簡単にスクレイピングを行うことができます。

次にRubyのNokogiriでスクレイピングするサンプルコードを解説していきます。

スクレイピングのサンプルコード

下記はNokogiriを使用して「Rubyとは」というキーワードでGoogle検索を行い、その検索結果ページから、各検索結果のタイトルとURLの一覧を取得するサンプルコードです。このコードを通して、Webページの内容を解析し、特定の情報を取り出す基本的な流れを学習することができます。

1require 'nokogiri'
2require 'open-uri'
3require 'cgi'
4
5# キーワードをURLエンコードする
6keyword = CGI.escape('Rubyとは')
7
8# 検索結果ページのURL
9url = "https://www.google.com/search?q=#{keyword}"
10
11# HTMLを取得する
12html = URI.open(url)
13
14# NokogiriでHTMLをパースする
15doc = Nokogiri::HTML(html)
16
17# XPathを使ってh3要素を探す(タイトル)
18doc.xpath('//h3').each do |h3|
19  # タイトルを取得
20  title = h3.text.strip
21
22  # h3タグの親ノードを遡ってリンク(aタグ)を見つける
23  link_node = h3.parent
24  while link_node && link_node.name != 'a'
25    link_node = link_node.parent
26  end
27
28  # リンクが見つかった場合
29  if link_node
30    url = link_node['href']
31
32    # Googleのリダイレクト形式のURLの場合、クリーンアップする
33    if url.start_with?('/url?q=')
34      clean_url = url.split('&').first.sub('/url?q=', '')
35      puts "Title: #{title}"
36      puts "URL: #{clean_url}"
37      puts
38    end
39  end
40end

作成したファイルは、以下のコマンドで実行できます。

1ruby index.rb

ライブラリを読み込む

プログラムの最初に、必要なライブラリを読み込みます。ライブラリとは、特定の機能を提供するプログラムの集まりのことです。requireという命令を使うことで、これらのライブラリを自分のプログラムで利用できるようになります。

1require 'nokogiri'
2require 'open-uri'
3require 'cgi'

ここで読み込んでいるライブラリは以下の通りです。

  • nokogiri: HTMLやXMLといったマークアップ言語の文書を解析し、そこから情報を抽出するための非常に強力なライブラリです。Webページの内容を構造的に扱えるようにします。
  • open-uri: WebページのURLを指定して、その内容(HTMLなど)を簡単に取得するためのライブラリです。インターネット上のファイルを開く際に利用します。
  • cgi: Webアプリケーションで一般的に使われるさまざまな機能をサポートするライブラリです。特に、URLに特殊な文字が含まれる場合に、正しく扱えるように変換(エンコード)する機能などで利用します。

検索URLを作成してHTMLを取得する

次に、Google検索を行うためのURLを作成します。Webサイトにアクセスするためには、そのWebサイトの正確なアドレス(URL)が必要です。

1keyword = CGI.escape('Rubyとは')
2url = "https://www.google.com/search?q=#{keyword}"

まず、検索キーワードとして「Rubyとは」という文字列を用意します。このキーワードをCGI.escapeというメソッドを使って「URLエンコード」しています。URLエンコードとは、URLに使用できない特殊な文字や日本語を、Webで安全に扱える形式に変換することです。例えば、半角スペースは%20に、日本語は%E3%83%AB%E3%83%93%E3%83%BC%E3%81%A8%E3%81%AFのような形式に変換されます。

Googleの検索結果ページのURLは、一般的にhttps://www.google.com/search?q=の後に検索キーワードが続く形式になっています。そこで、URLエンコードしたキーワードを変数keywordに格納し、"..."の中に#{変数名}という形式で埋め込む「変数展開」を使って、完全な検索URLを作成しています。

作成したURLに対して実際にアクセスし、Webページが持っているHTMLデータを取得します。

1html = URI.open(url)

URI.open(url)という命令を実行すると、指定したURLのWebサーバーにリクエストを送信し、Webページの内容(HTMLテキスト)を受け取ることができます。このHTMLテキストが変数htmlに格納されます。

HTMLドキュメントを解析する

Webページから取得したHTMLデータは、ただの長いテキストデータです。このテキストデータから特定の情報(例えば検索結果のタイトルやURL)を効率よく探し出すためには、HTMLの構造を理解できる形に変換する必要があります。この変換作業を「パース(解析)」と呼びます。

1doc = Nokogiri::HTML(html)

Nokogiri::HTML(html)というコードは、取得したHTMLテキストをNokogiriが扱いやすい「HTMLドキュメントオブジェクト」に変換しています。このオブジェクトに変換することで、HTMLの要素(タグ)や属性を簡単に検索したり、値を取り出したりできるようになります。

XPathでタイトルを取得する

Webページの構造を確認するためには、ブラウザの「開発者ツール」が非常に便利です。多くのブラウザでF12キーを押すことで開発者ツールを開き、Webページのどの部分がどのようなHTMLタグで構成されているかを確認できます。今回のGoogle検索結果ページの場合、検索結果のタイトルは通常h3タグで表示されていることがわかります。

そこで、「XPath(XML Path Language)」という、HTMLやXMLドキュメントの中から特定の要素を指定するための言語を使って、すべてのh3要素を探し出します。

1doc.xpath('//h3').each do |h3|
2  title = h3.text.strip

doc.xpath('//h3')は、ドキュメント全体(//)からすべてのh3タグを探し出すXPathの指定です。これにより見つかった各h3要素に対して、eachメソッドを使って一つずつ処理を行います。

h3.textは、そのh3タグに含まれるテキストコンテンツ(文字情報)を取得します。さらに、.stripメソッドを使うことで、テキストの前後に含まれる不要な空白文字や改行コードを取り除き、きれいなタイトル文字列を取得しています。

親ノードを遡ってリンクを取得する

Google検索結果のHTML構造では、タイトル(h3タグ)が直接リンク(aタグ)になっているわけではなく、その親要素や祖先要素にリンクが存在することが多いです。そこで、h3タグの親要素をたどって、リンクであるaタグを見つけ出す処理を行います。

1link_node = h3.parent
2while link_node && link_node.name != 'a'
3  link_node = link_node.parent
4end

HTMLドキュメントにおいて、各タグは「ノード」と呼ばれ、親子関係を持っています。h3.parentは、現在のh3タグの直上の親ノードを取得します。

whileループは、指定した条件が真(true)である限り、繰り返し処理を行う構文です。ここでは、link_nodeが存在し、かつlink_node.name(ノードの名前、つまりタグの名前)が'a'ではない場合にループを続けます。ループの中では、link_node = link_node.parentとして、現在のlink_nodeをさらにその親ノードに上書きし、aタグが見つかるまで親を遡っていく動きになります。

GoogleのリダイレクトURLをクリーンアップする

最終的に見つかったaタグから、リンク先のURLを取得し、必要な情報だけを抽出して出力します。

1if link_node
2  url = link_node['href']
3
4  if url.start_with?('/url?q=')
5    clean_url = url.split('&').first.sub('/url?q=', '')
6    puts "Title: #{title}"
7    puts "URL: #{clean_url}"
8    puts
9  end
10end

if link_nodeという条件文は、aタグが実際に見つかった場合にのみ処理を続けることを意味します。link_node['href']と書くことで、見つかったaタグのhref属性の値(つまりリンク先のURL)を取得できます。

Googleの検索結果のURLは、直接的なリンクではなく、/url?q=記事のURL&sa=...のような形で、一度Googleのリダイレクトサーバーを経由する形式になっていることがあります。このままだと余分な情報が含まれてしまうため、純粋な記事のURLだけを抽出する必要があります。

  • url.start_with?('/url?q='): 取得したURLが/url?q=で始まるかどうかを判定します。この文字列で始まる場合、リダイレクトURLであると判断できます。
  • url.split('&'): URLを&で区切り、分割された文字列の配列を作成します。
  • .first: 分割された配列の最初の要素(/url?q=記事のURLの部分)を取得します。
  • .sub('/url?q=', ''): 最初の要素から/url?q=という文字列を空文字列に置き換えることで削除します。

これらの文字列操作を組み合わせることで、リダイレクト情報を取り除き、本来のクリーンな記事のURL(clean_url)だけを取り出すことができます。

最後に、取得したタイトルとクリーンアップしたURLをputsメソッドを使ってターミナルに出力します。putsは文字列を表示し、改行する命令です。

このコードを実行すると、ターミナルに「Rubyとは」でGoogle検索した結果のタイトルとURLが一覧で表示されることを確認できます。

おわりに

この記事では、RubyのNokogiriライブラリを使ったWebスクレイピングの基本的な手順と、その応用方法を学びました。 開発環境の準備からNokogiriのインストール、open-uriやcgiなどのライブラリを組み合わせてWebページにアクセスする方法を理解しました。 具体的には、Google検索結果のHTMLをNokogiri::HTMLで解析し、XPathの//h3でタイトル要素を特定し、その親ノードを遡ってURLを取得する手法を実践しました。 さらに、Google特有のリダイレクトURLをsplitやsubメソッドでクリーンアップする処理を通して、実践的なデータ抽出のスキルを習得できたことでしょう。

関連コンテンツ

関連IT用語