Nokogiriを使ってみる

投稿日: カテゴリー Ruby

あるサイトでは、電子書籍で発売した漫画の一覧を観ることができる。
そのサイトを見るのが日課だったのだけど、正直毎日確認するのが面倒くさいと思ってた。
そこで、いい感じに一覧を取得できないか調べたところ、いわゆるスクレイピングなどでよく使われるNokogiriを使ってみることにした。

実際に書いたコードはこちら。

require 'yaml'
require 'open-uri'
require 'nokogiri'

list = YAML.load_file("list.yaml")

list['siteurl'].each do | url |
  doc = Nokogiri::HTML(open(url).read)
  puts "=== Info === "
  p doc.title
  doc.xpath('//h2[@class="entry-title"]').each do | node |
    puts node.text
  end
end

見て分かるように大変シンプルなコードで簡単に取得できた。

取得できた情報はこんな感じ。

=== Info ===
絢爛たるグランドセーヌ 第01-06巻 [Kenrantaru Grande Seene vol 01-06]
Ultraman 第01-08巻
ディメンションW 第01-10巻 [Dimension W vol 01-10]
ねじ巻き精霊戦記 天鏡のアルデラミン 第01巻 [Nejimaki Seirei Senki – Tenkyou no Alderamin vol 01]
生徒会副会長矢上さゆりは頑張っている! 第01巻 [Seitokai Osayagami Sayuri wa Ganbatte Iru! vol 01]
黒崎くんの言いなりになんてならない 第01-07巻 [Kurosaki-kun no Iinari ni Nante Naranai vol 01-07]
ソードアート・オンライン プログレッシブ 第01-05巻 [Sword Art Online – Progressive vol 01-05]
木根さんの1人でキネマ 第01-02巻 [Kine-san no 1-ri de Cinema vol 01-02]

頻繁にアクセスしてバンされたら嫌だなぁと思って、サイトURLはyamlでリストを管理することにした。
最初ソースを全部取得するのはすぐにできたのだけど、その後にどのように書いたら特定のタグの値を取得できるかがわからなかった。
このソースを見て分かるように、xpathというメソッドで指定している。
pathは”//”で指定して書いてくので、ちょっと独特だなと感じたけど、理解すればそこまででも無い。
このままだとサイトにアクセスしてるのと同じレベルなので、次はSlack通知するようにしたい。