tsurutanのつぶやき

備忘録としてつぶやきます

Rubyでスクレイピングをしてみよう!

Rubyでスクレイピングをしてみよう!

Scrapingでできること

・店舗一覧、商品一覧を抽出する ・ニュースサイトからヘッドライン一覧を抽出する ・ページのURLを全て抽出する などなど今まで煩わしかったことが解消できます!

Rubyの開発環境

すでにRubyをインストール済みであればこの章を飛ばしてもらって大丈夫です。

1.rbenvのインストール

1.gitが入っているか確認しましょう。入っていなければインストール。

http://git-scm.com/download/mac
sudo yum -y install git

2.rbenvをgithubからclone,インストールしましょう

git clone https://github.com/sstephenson/rbenv.git ~/.rbenv

3.環境変数を作成しrbenvの環境を整えましょう。

# PATH に追加
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile

# .bash_profile に追加
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

# 上記設定の再読み込み
$ exec $SHELL -l

4.rbenvが入っているか確認しましょう

$ rbenv --version
rbenv 0.4.0-74-g95a039a

5.ruby-buildをインストールしましょう

$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

クローンしてもインストールされていない場合は

~/.rbenv/plugins/ruby-build/install.sh

をしましょう。

6.rubyの最新版を確認しましょう

$ rbenv install --list
Available versions:
  1.8.6-p383
  1.8.6-p420
  1.8.7-p249
   :
   :
  2.2.0
  2.2.1
  2.2.2
  2.2.3       ← こいつが2.2系の最新版っぽい     
  :

7.ruby のインストールをしましょう 先ほどのバージョンを指定しましょう。

$ rbenv install -v 2.2.3

8.ruby のバージョン指定をしましょう

$ rbenv rehash
$ rbenv versions
* system (set by /home/vagrant/.rbenv/version)
  2.0.0-p353

systemが付いているバージョンが現在使用されているものです

rbenv global 2.2.3

最後に正しくsystemのところに2.2.3が来ていることを確認しましょう。

ruby -v

2.Nokogiriをインストール

rubyでスクレイピングをするにはNokogiriが必須です。Nokogiriについてはここで詳しく説明されていますので気になったら見てみると良いですね。 またgemのインストールにbundle, home brewを使うので予めインストールしておきましょう。

1.Nokogiriのインストール

gem install nokogiri

Railsを使わなければこれだけで大丈夫です。

Railsのプロジェクトで使う場合はGemfile

gem install nokogiri

と書きましょう。 次にターミナルでGemをインストールしましょう。

bundle install

3.とりあえずサンプルプログラムを使ってみよう!

3.1 ホームページタイトルの取得

以上環境設定が終わりましたので次にサンプルプログラムを使って、どのコードがどのような役割を担っているのか見てみましょう

まず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"

課題1 早稲田大学のホームページからタイトル「早稲田大学」を取得してみましょう。http://www.waseda.jp/top/

3.2 タイトル、画像一覧の取得

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

require 'open-uri'
require 'nokogiri'
# スクレイピング先のURL
url = 'http://ad-navi.sendenkaigi.com/actor_company/'

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('//div[@class="corp_data2"]').each do |node|

  p node.css('p[1]').inner_text

  p node.css('p.right.nomal').inner_text.match(/[0-9]+/).to_s.to_i

  p node.css('dl[3]/dd').inner_text

end

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

ruby ad_navi.rb

実行するとこのようが結果になるはずです。

"BBDO J WEST株式会社"
48
"福岡県/広島県/沖縄県/山口県"
"株式会社Gunosy"
70
"東京都"
"株式会社アズライフ"
42
"東京都"
"Glossom株式会社"
80
"東京都"
"株式会社ハタジルシ"
5
"東京都"
"アイビスティ有限会社"
4
"東京都"
...

課題2 早稲田大学のニュースページからニュースのタイトルと画像の一覧を取得してみましょう。http://www.waseda.jp/top/news

Pythonでのスクレイピングについても書いたので是非読んでください!

www.tsurutan.com

実践 Webスクレイピング&クローリング-オープンデータ時代の収集・整形テクニック

実践 Webスクレイピング&クローリング-オープンデータ時代の収集・整形テクニック

JS+Node.jsによるWebクローラー/ネットエージェント開発テクニック

JS+Node.jsによるWebクローラー/ネットエージェント開発テクニック