Ruby gem Nokogiriでスクレイピングした際に覚えた事・サンプルを記載しておきます。
勉強まっただ中なので随時追記していきます。
見出し
導入
1 |
$ gem install nokogiri |
テンプレ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# -*- 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環境で実行した際にこれを入れないと表示出来なかった為です。他の環境だと違うのかもしれません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
# -*- 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に慣れていない為、これが結構難しかったので色々やった事を書いていきます。
普通に要素を指定
1 2 3 4 5 6 |
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指定
1 |
element_h1 = html.css('#hoge_id') |
クラス名指定
1 |
element_h1 = html.css('.hoge_class') |
指定ID配下の指定クラス
1 |
element_h1 = html.css('#hoge_id .hoge_class') |
隣りの要素を指定
1 |
element_h1 = html.css('h1+h2') |
h1の隣りのh2を指定します。
指定IDを持つ要素
1 |
element_h1 = html.css('h1:has(#hoge_id)') |
詳しくわかりませんがcss4で実装される?hasというのが使えるようです。
指定IDを持つ要素の隣りの要素を指定
1 |
element_h1 = html.css('h1:has(#hoge_id)+h2') |
1個上と2個上の例が統合された場合の例です。スクレイピングする先がID一発で取得出来たり、クラス名だけど取得出来たりするのはまれで、結構こんな感じでゴリゴリ書いていくのがメインでした。
または or
1 |
element_h1 = html.css('h1, h2') |
これもCSSと同じようにカンマで区切れます。結構スクレイピング先が同じパターンで書かれている事って少なく、例外がちょくちょく出てきます。その際にこれを使っています。コードで見るとカオスな事になってくるのが悩みです・・・。
XPATH
より抽象的に取得しようとするとXPATHを使用した方が良かったです。以下にまとまっていました。
参考サイト様
https://qiita.com/rllllho/items/cb1187cec0fb17fc650a
ここに書いてあるXPATHをブラウザで瞬時に表示出来るChromeの拡張機能がすごい便利です。悩みから一気に解放された感があります。
全然勉強中なのですが参考になれば何よりです。また追記します!