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の拡張機能がすごい便利です。悩みから一気に解放された感があります。
全然勉強中なのですが参考になれば何よりです。また追記します!

