Help us understand the problem. What is going on with this article?

Ruby + Nokogiriでスクレイピング

More than 1 year has passed since last update.

最近業務で使うことがあったのでスクレイピングのネタでQiita初投稿します。

この記事での実行環境は以下のようになっております

CentOS 6.8

$ ruby -v
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux]

$ nokogiri -v
# Nokogiri (1.6.8.1)

What's スクレイピング?

ウェブスクレイピング(英: Web scraping)とは、ウェブサイトから情報を抽出するコンピュータソフトウェア技術のこと。 ウェブ・クローラーあるいはウェブ・スパイダーとも呼ばれる。
https://ja.wikipedia.org/wiki/ウェブスクレイピング より引用

ようするに特定のウェブサイトからほしい情報を抜き取ることっすね!

What's Nokogiri?

Rubyでスクレイピングするときの定番ライブラリ

公式サイト
http://www.nokogiri.org/

準備

まずは以下のコマンドでNokogiriをインストールしましょう

$ gem install nokogiri
Building native extensions.  This could take a while...
Successfully installed nokogiri-1.6.8.1
Parsing documentation for nokogiri-1.6.8.1
Done installing documentation for nokogiri after 3 seconds
1 gem installed

インストールに成功していれば、以下のコマンドでバージョンを確認できます

$ nokogiri -v
# Nokogiri (1.6.8.1)
    ---
    warnings: []
    nokogiri: 1.6.8.1
    ruby:
      version: 2.3.1
      platform: x86_64-linux
      description: ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux]
      engine: ruby
    libxml:
      binding: extension
      source: packaged
      libxml2_path: "/home/vagrant/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/nokogiri-1.6.8.1/ports/x86_64-pc-linux-gnu/libxml2/2.9.4"
      libxslt_path: "/home/vagrant/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/nokogiri-1.6.8.1/ports/x86_64-pc-linux-gnu/libxslt/1.1.29"
      libxml2_patches: []
      libxslt_patches: []
      compiled: 2.9.4
      loaded: 2.9.4

ファイルを作成してライブラリを読み込むための記述を追加します

scrape.rb
require 'nokogiri'

# URLに簡単にアクセスできるようにするためのライブラリ
require 'open-uri'
# CSV出力をできるようにするためのライブラリ
require 'csv'

追加したgemをインストールしたら準備完了です

$ bundle install

Let's スクレイピング!

今回はQiitaに投稿されているRubyに関する記事のタイトルを取得してみます

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

url = 'https://qiita.com/search?q=ruby'

charset = nil

html = open(url) do |f|
    charset = f.charset
    f.read
end

doc = Nokogiri::HTML.parse(html, nil, charset)
doc.xpath('//h1[@class="searchResult_itemTitle"]').each do |node|
  p node.css('a').inner_text
end

出力結果

$ ruby scrape.rb
"RUBY"
"Rubyってなんだ"
"Rubyにないもの"
"Rubyだったら"
"Ruby"
"Ruby"
"【Ruby】Ruby入門:%記法について"
"RubyでRubyを描く"
"【Ruby】Ruby入門:クラスについて"
"Ruby | case と === の歴史 #ruby"

もうちょっといろいろやってみたいっすね
RubyとPHPとSwiftに関する記事のタイトルを取得してCSVに出力してみます

scrape.rb
require 'nokogiri'
require 'open-uri'
require 'csv'

urls = %w(
  https://qiita.com/search?q=ruby,
  https://qiita.com/search?q=php,
  https://qiita.com/search?q=swift
)
titles = []

charset = nil
urls.each do |url|
  html = open(url) do |f|
    charset = f.charset
    f.read
  end

  doc = Nokogiri::HTML.parse(html, nil, charset)
  doc.xpath('//h1[@class="searchResult_itemTitle"]').each do |node|
    title = node.css('a').inner_text
    titles.push(title)
  end
end

CSV.open("qiita_title.csv", "w") do |csv|
  csv << titles
end

同じディレクトリにcsvファイルが作成されます

qiita_titile.csv
Macport と anyenv を使っているときに ruby-build を使って最新の ruby をインストールする方法,Railsで新規プロジェクトを始めるまで,zero-server maps 日本語版,RailでCSVエクスポートする,Rubyでオブジェクトの中身を調べたい時によく使うメソッド,El Capitanでopenssl/ssl.h が無いとかいうエラーが出た場合,mini_exiftool で Exif を解析してレンズ名を取り出す,railsとtwilioで電話を掛けてみた,RUBY,Rubyってなんだ,PHP,PHP,phpでphpをはさむ方法,【PHP】PHP_EOL,PHP 配列 ,herokuでPHP,PHP Basics,phpの型,Awesome PHP,PHP で setuidgid,swift,Swift,Swift の ?? ってなんだっけ,【Swift】Swiftのversionを確認しよう,[Swift] Swift Memo,Start Developing iOS Apps (Swift) 1-1,TableViewCellの右ずれを直す,代入と出力,Delegation,Swift で AppBank Fello を利用する

まとめ

ぼくが実際に業務で行った作業は、サイト内のimgタグをスクレイピングして特定のパスに置換したものをCSVとして出力するというものでした。
初めてスクレイピングをやってみましたが、ほしいデータを取得して出力できたときは快感でした!
簡単かつ工夫次第でいろんなデータの取得ができるのでぜひ試してみてください!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away