LoginSignup
10
5

More than 1 year has passed since last update.

Nokogiriを使った基礎的なWebスクレイピングを学びました

Last updated at Posted at 2021-11-14

Webスクレイピングについて基礎的な学習をしたので、アウトプットさせていただきます。

Nokogiriとは

Nokogoriとはgemで提供されているWebスクレイピングライブラリのことで、gemを使ってライブラリをインストールすると使えるようになります。

$ gem install nokogiri

Webスクレイピングとは

Webサイトから情報を取得して、その情報に加工を加えて新たな情報を生み出すことです。
APIとの違いとして、APIはサービス側が開発者向けに一定の条件のもと、公式に機能の一部を使用できるようにしていますが、Webスクレイピングは公式のサービスとは言えず、無作為に使用していると利用規約に引っかかる可能性があり、その点の注意が必要になります。

Webスクレイピングの活用方法

例えば、価格.comから好きな家電の価格を取得して、一覧表をCSVで記録するといった具合に必要な情報を自動化して取得し、業務の効率化やAPIにはないデータの取得に役立つ等のメリットがあります。
逆にデメリットとしては、DOM構造が変わったりすると、それまで正常に機能していたコードが機能しなくなり、修正を加えないといけない等のデメリットがあります。

DOMとは〜Webスクレイピングの前提知識

DOMとはJavaScript等のプログラミング言語でhtmlの要素を操作するための仕組みのことで、「Document Object Model」の略です。
分かりやすい日本語に直すと、プログラムからHTMLやXMLを自由に操作するための仕組みのことで、ファイル(HTML)の任意の部分に目印を付けて「この部分にこういう事をしたい」という処理を可能にするための仕組みがDOMです。

特徴としては、

  • ツリー構造という階層構造である
  • 各要素のことを「ノード」という
  • WEBページとプログラミング言語とを繋ぐ仕組み

といった特徴があります。
この仕組みを使って例えばJavaScriptはWebサイトに動きをつけることができるようになります。
WebスクレイピングではDOMを理解した上で、要素を指定します。

次に、RubyでWebスクレイピングを行う際に使用する組み込みライブラリを説明します。

open-uri

Rubyの組み込みライブラリで、URLからサイトにアクセス(サイト情報をファイルのように扱うことができる)して、様々なメタ情報を取得する際に使用します。
このライブラリを使用して、スクレイピングを行うURLをファイルとして開き、Nokogiriを使って分析していくイメージです。

open-uriサンプル 公式より
require 'open-uri'
URI.open("http://www.ruby-lang.org/en") {|f|
  f.each_line {|line| p line}
  p f.base_uri         # <URI::HTTP:0x40e6ef2 URL:http://www.ruby-lang.org/en/>
  p f.content_type     # "text/html"
  p f.charset          # "iso-8859-1"
  p f.content_encoding # []
  p f.last_modified    # Thu Dec 05 02:45:02 UTC 2002
}

公式リファレンス

Nokogiriを使ったWebスクレイピングの流れ

スクレイピングの簡単な流れは

  • 求めるデータがどのノードにあるのか探す
  • 見つけたデータを取得
  • 取得したデータを自由な形に整形して利用する

という流れで行います。

Nokogiriの要素指定方法

Nokogiriの要素の指定方法にはXPathによる指定とCSSセレクタによる指定の2パターンがあり、Webスクレイピング目的であればCSSセレクタの使用が推奨されているようです。

以下の記事でNokogiriの使い方をざっくり理解できます
Nokogiriでスクレイピング - Qiita

Webスクレイピングをやってみる

これからこちらのスクレイピング用の練習サイトを利用させてもらって、とにかくスクレイピングをやってみて、イメージを掴みます。
さきほどの流れに沿って進めていくと、まずは「求めるデータがどのノードにあるのか探す」をやっていきます。
先ほどのWebサイトの「タイトルタグ」を取得していきます。
image.png

欲しいデータを決めたので、次に「見つけたデータを取得」します。

scraping_test.rb
require 'open-uri'
require 'nokogiri'

# Webスクレイピングを行うサイトのURL
url = 'https://scraping-for-beginner.herokuapp.com/ranking/'

html = URI.open(url).read
document = Nokogiri::HTML.parse(html)

# 指定した要素からテキストを取得して表示する
element_title = document.title 
puts element_title
xxx@MacBook-Pro ruby_test % ruby scraping_test.rb 
Webスクレイピング入門者のためのサイト

タイトルタグを取得することができました。
今回は、取得した情報を加工等はせずに、そのまま表示させていますが、スクレイピングのイメージを掴むことはできたと思います。

このような感じでWebスクレイピングは、Webサイトから欲しい情報を取得して、データを使うことができます。
Webスクレイピングを学習していく中で、いろんな利用方法が想像できて、とても面白く感じました。
今回は、基礎的な部分をアウトプットしましたが、学習を深めて、もっと応用的なアウトプットもしていきたいと思います。
ご覧いただきありがとうございました。

参照
RubyでWebスクレイピング

10
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
5