Ruby Nokogiriでスクレイピングした際に覚えた事・サンプル

Ruby Nokogiriでスクレイピングした際に覚えた事・サンプル

Ruby gem Nokogiriでスクレイピングした際に覚えた事・サンプルを記載しておきます。

勉強まっただ中なので随時追記していきます。

導入

$ gem install nokogiri

テンプレ

# -*- coding: utf-8 -*-

require 'nokogiri'
require 'open-uri'
require 'csv'

module Crawler
  class Normalblog
    def getData

      base_url = 'https://normalblog.net/system'

      # 処理

    end
  end
end

crawler = Crawler::Normalblog.new
crawler.getData

サンプル集

Normalblogのaタグ内テキストをCSVに出力

スクレイピングした結果をCSVに出力するのをメインにして使っていました。下のサンプルでencodeしているのはwindows環境で実行した際にこれを入れないと表示出来なかった為です。他の環境だと違うのかもしれません。

# -*- coding: utf-8 -*-

require 'nokogiri'
require 'open-uri'
require 'csv'

module Crawler
  class Normalblog
    def getData

      base_url = 'https://normalblog.net/system'

      CSV.open('normalblog.csv', 'wb') do |csv|
        html = Nokogiri::HTML(open(base_url))

        csv_tmp = ''
        html.css('a').each do |el_a|
            p el_a.text
            p el_a.text.encode(Encoding::Windows_31J, undef: :replace, replace: '')
            csv_tmp << el_a.text.encode(Encoding::Windows_31J, undef: :replace, replace: '') + ','
        end
        csv << [csv_tmp]

      end

    end
  end
end

crawler = Crawler::Normalblog.new
crawler.getData

.css

CSSセレクタを使用して要素を抽出します。CSSに慣れていない為、これが結構難しかったので色々やった事を書いていきます。

普通に要素を指定

html = Nokogiri::HTML(open("https://normalblog.net"))
element_a = html.css('a')
element_h1 = html.css('h1')
element_h1 = html.css('#hoge_id')
element_h1 = html.css('.hoge_class')
element_h1 = html.css('#hoge_id .hoge_class')

.cssの中にCSSと同じように指定できます。

以後は「html = Nokogiri::HTML(open(“https://normalblog.net”))」の一文省略します。

ID指定

element_h1 = html.css('#hoge_id')

クラス名指定

element_h1 = html.css('.hoge_class')

指定ID配下の指定クラス

element_h1 = html.css('#hoge_id .hoge_class')

隣りの要素を指定

element_h1 = html.css('h1+h2')

h1の隣りのh2を指定します。

指定IDを持つ要素

element_h1 = html.css('h1:has(#hoge_id)')

詳しくわかりませんがcss4で実装される?hasというのが使えるようです。

指定IDを持つ要素の隣りの要素を指定

element_h1 = html.css('h1:has(#hoge_id)+h2')

1個上と2個上の例が統合された場合の例です。スクレイピングする先がID一発で取得出来たり、クラス名だけど取得出来たりするのはまれで、結構こんな感じでゴリゴリ書いていくのがメインでした。

または or

element_h1 = html.css('h1, h2')

これもCSSと同じようにカンマで区切れます。結構スクレイピング先が同じパターンで書かれている事って少なく、例外がちょくちょく出てきます。その際にこれを使っています。コードで見るとカオスな事になってくるのが悩みです・・・。

XPATH

より抽象的に取得しようとするとXPATHを使用した方が良かったです。以下にまとまっていました。

参考サイト様

https://qiita.com/rllllho/items/cb1187cec0fb17fc650a

ここに書いてあるXPATHをブラウザで瞬時に表示出来るChromeの拡張機能がすごい便利です。悩みから一気に解放された感があります。

 

全然勉強中なのですが参考になれば何よりです。また追記します!

Comments

No comments yet. Why don’t you start the discussion?

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です