酒と泪とRubyとRailsと

Ruby on Rails と Objective-C は酒の肴です!

Nokogiri を使った Rubyスクレイピング [初心者向けチュートリアル]

プログラム初心者な方向けに始めたRailsチュートリアルシリーズです。今回はRubyでスクレイピングをしたいという人向けに『Nokogiri』というライブラリを使ったスクレイピングのチュートリアルを作ってみました!


目次

(1) Webスクレイピングとは?
(2) Nokogiriとは?
(3) 最初に読んでおくと捗りそうな記事
(4) Gem Nokogiriのインストール
(5) Yahoo!Japanのトップページからtitleを取得
(6) NaverまとめTechページの注目一覧のタイトル・画像を取得
(7) 実際にコードを書くときに参考になるサイト
(8) Railsへの組み込み

(1) Webスクレイピングとは?

WebスクレイピングとはWebサイトのHTMLデータを収集して、特定のデータを抽出・整形することです。Webスクレイピングの応用例としては次のような場面があります。

* 部分的なコンテンツを抽出して、携帯向けのコンテンツとして使う
* 小見出しを取り出して目次を作成する

参照元: Webスクレイピングとは (Web scraping) ウェブスクレイピング: - IT用語辞典バイナリ

(2) Nokogiriとは?

Nokogiri』とはスクレイピングでよく使われるRubyのライブラリです。特徴は次の通り。

* HTMLやXMLの構造を解析して、特定の要素を指定しやすい形に加工できる
XpathやCSSセレクタを使った要素の抽出を行うことができる

XPathやCSSセレクタの説明は下記サイトがわかりやすかったです!

1.XPath の基本 1 | TECHSCORE(テックスコア)

意外と知らない!?CSSセレクタ20個のおさらい

(3) 最初に読んでおくと捗りそうな記事

http://www.engineyard.co.jp/blog/2012/getting-started-with-nokogiri/

Engine Yardさんのブログ『Nokogiri の基本(翻訳版)』は、イメージやサンプルソースをうまくつかながらキーワードを丁寧に説明してくれています。

(4) Gem Nokogiriのインストール

NokogiriのインストールはRubyのスクリプトの場合は次の通りです。

1
gem install nokogiri

Railsのプロジェクトで使う場合は、Gemfileに次のコードを追加します。

1
gem 'nokogiri'

次にターミナルでGemをインストール。

1
bundle install

(5) Yahoo!Japanのトップページからtitleを取得

ここからは少し手を動かしながら、実際にYahoo!Japanのトップページからtitleを取得してくるRubyのスクリプトを作ります。

まず、ファイルscrape_yahoo_title.rbを作成します。作成したファイルをエディタで開いて次のようなソースを書きます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# URLにアクセスするためのライブラリの読み込み
require 'open-uri'
# Nokogiriライブラリの読み込み
require 'nokogiri'

# スクレイピング先のURL
url = 'http://www.yahoo.co.jp/'

charset = nil
html = open(url) do |f|
  charset = f.charset # 文字種別を取得
  f.read # htmlを読み込んで変数htmlに渡す
end

# htmlをパース(解析)してオブジェクトを生成
doc = Nokogiri::HTML.parse(html, nil, charset)

# タイトルを表示
p doc.title

作成したら、ターミナルで以下のコマンドにより実行できます。

1
ruby scrape_yahoo_title.rb

すると以下の様な結果が帰ってくれば成功です。

1
"Yahoo! JAPAN"

(6) NaverまとめTechページの注目一覧のタイトル・画像を取得

次にNaverまとめのTechページの注目一覧のタイトル・画像を取得してみます。

まず、ファイルscrape_naver_matome_tech.rbを作成します。作成したファイルをエディタで開いて次のようなソースを書きます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
require 'open-uri'
require 'nokogiri'

# スクレイピング先のURL
url = 'http://matome.naver.jp/tech'

charset = nil
html = open(url) do |f|
  charset = f.charset # 文字種別を取得
  f.read # htmlを読み込んで変数htmlに渡す
end

# htmlをパース(解析)してオブジェクトを作成
doc = Nokogiri::HTML.parse(html, nil, charset)

doc.xpath('//li[@class="mdTopMTMList01Item"]').each do |node|
  # tilte
  p node.css('h3').inner_text

  # 記事のサムネイル画像
  p node.css('img').attribute('src').value

  # 記事のサムネイル画像
  p node.css('a').attribute('href').value
end

作成したら、ターミナルで以下のコマンドにより実行できます。

1
ruby scrape_yahoo_title.rb

(5), (6)のサンプルソースはGitHubに公開しています。

(7) 実際にコードを書くときに参考になるサイト

http://d.hatena.ne.jp/otn/20090509/p1

実際にNokogiriのコードを書くときに役に立ちそうなチートシート的なサイトがこの『スクレイピングのためのNokogiri利用メモ』。 Nokogiriでスクリプトを書いていく上で何度もお世話になると思います。

http://cockscomb.info/scrape_kishocho_with_ruby_and_nokogiri/

Nokogiriを使って、気象庁のデータをスクレイピングしたサンプルソースが載っているサイトがこの『Ruby + Nokogiri で 気象庁スクレイピング』。実際にコードを書いている時に詰まったら、読んでみるのもいいかも。

http://beyond.cocolog-nifty.com/akutoku/2009/04/ruby-nokogiriwi.html

こちらはWikipediaのデータをスクレイピングしたサンプルソースが書かれているのが『Nokogiriで、Wikipediaの記事をパースする』です。書いていく上でのヒントになるかも。

(8) Railsへの組み込み

Rubyでスクリプトができたら、Rakeタスクにして呼び出すのが一番シンプルだと懐います。拙著『RailsでオリジナルRakeタスク作成からRSpecテストまで』をよかったら御覧ください。

Special Thanks

RubyのNokogiriを使ってサイトをスクレイピングする

押さえておきたい書籍

いかがだったでしょうか?
もし説明がわかりにくかったり、間違っている場所があればぜひ一言!

Comments