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を使って分析していくイメージです。
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サイトの「タイトルタグ」を取得していきます。
欲しいデータを決めたので、次に「見つけたデータを取得」します。
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スクレイピングを学習していく中で、いろんな利用方法が想像できて、とても面白く感じました。
今回は、基礎的な部分をアウトプットしましたが、学習を深めて、もっと応用的なアウトプットもしていきたいと思います。
ご覧いただきありがとうございました。