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

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

(05-02 08:10) 補足: Windowsではじめての人向けの記事を追加


🐡 目次

(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のスクリプトの場合は次のとおりです。

gem install nokogiri

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

gem 'nokogiri'

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

bundle install

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

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

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

# 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

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

ruby scrape_yahoo_title.rb

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

"Yahoo! JAPAN"

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

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

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

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

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

ruby scrape_naver_matome_tech.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の記事をパースする』です。書いていく上でのヒントになるかも。

Ruby製の構文解析ツール、Nokogiriの使い方 with Xpath

Nokogiriのメソッドを網羅的に説明してくれている記事。Nokogiriを使いこなしていく中で、より洗練された書き方を模索したくなったらぜひ読んでほしい記事です。

Nokogiriによるスクレイピング(YahooFinance)

Yahoo!Financeの情報をスクレイピングするサンプルソース。短くて読みやすいので勉強にちょうどいいかも。

🐹 (8) Railsへの組み込み

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

👽 補足: Windowsではじめての人向けの記事

最強の情報収集術!初心者向けRuby+NokogiriでWebスクレイピング徹底解説

RubyInstallerから始まっているので完全初心者の人にもとっつきやすい記事です!

🐮 お願い

個人的に初心者向けにRuby/Railsを教える機会が増えています。この記事に関連する分野で効率的に勉強するのにお勧めな資料をご存じなら、Twitterで@zyunnosukeにメッセージorコメントいただけたら感激します!

逆にこの記事を使ってトライしたら、なんかうまく動かない的な話も同じく大歓迎です。いつでもメッセージください!

😸 参考リンク

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

🐰 変更来歴

(04/16 08:10) (7) 実際にコードを書くときに参考になるサイトを追加

(05-01 21:45) (7) 実際にコードを書くときに参考になるサイトを追加

(05-02 08:10) 補足: Windowsではじめての人向けの記事を追加

📚 おすすめの書籍