Nokogiriを使って天気をスクレイピングしてみた


Nokogiri を使った Rubyスクレイピング [初心者向けチュートリアル]を先に読みましょう。

実行環境

  • OS X El Capitan バージョン 10.11.4
  • ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin15]
  • Nokogiri (1.6.7.2)

今回スクレイピングするページ

岩手県の天気 - 日本気象協会 tenki.jp

岩手県の各地域の天気をスクレイピングしてみます。

実装

weather.rb

# URLにアクセスするためのライブラリの読み込み
require 'open-uri'
# Nokogiriライブラリの読み込み
require 'nokogiri'

# スクレイピング先のURL
url ='http://www.tenki.jp/forecast/2/6/'

charset = nil
html = open(url) do |f|
  charset = f.charset # 文字種別を取得
  f.read # htmlを読み込んで変数htmlに渡す
end

# htmlをパース(解析)してオブジェクトを作成
doc = Nokogiri::HTML.parse(html, nil, charset)

# 日付
puts doc.xpath('//p[@id="forecast_public_date"]').inner_text

doc.xpath('//a[@class="forecast_map_entry"]', '//ul[@id="forecast_list_entries"]/li[position()<8]/a').each do |node|
  # 場所
  place = node.child.inner_text

  # 天気
  weather = node.css('img').attribute('title').value

  # 降水確率
  probability = node.css('span.probPrecip').inner_text

  puts "#{place}の天気は#{weather}で降水確率は#{probability}です。" 
end

実行結果


05月08日(日)
盛岡市の天気は晴で降水確率は0%です。
宮古市の天気は晴で降水確率は0%です。
大船渡市の天気は晴で降水確率は0%です。
花巻市の天気は晴で降水確率は0%です。
久慈市の天気は晴で降水確率は0%です。
一関市の天気は晴で降水確率は0%です。
北上市の天気は晴で降水確率は0%です。
釜石市の天気は晴で降水確率は0%です。
二戸市の天気は晴で降水確率は0%です。
八幡平市の天気は晴で降水確率は0%です。
奥州市の天気は晴で降水確率は0%です。
雫石町の天気は晴で降水確率は0%です。
遠野市の天気は晴で降水確率は0%です。
滝沢市の天気は晴で降水確率は0%です。
紫波町の天気は晴で降水確率は0%です。
平泉町の天気は晴で降水確率は0%です。
岩手町の天気は晴で降水確率は0%です。
岩泉町の天気は晴で降水確率は0%です。
軽米町の天気は晴で降水確率は0%です。

無事スクレイピングできました!

XPathに頼らない方法

ここでは、遠野市から軽米町までをスクレイピングしてみます。

実装

weather2.rb

# URLにアクセスするためのライブラリの読み込み
require 'open-uri'
# Nokogiriライブラリの読み込み
require 'nokogiri'

# スクレイピング先のURL
url ='http://www.tenki.jp/forecast/2/6/'

charset = nil
html = open(url) do |f|
  charset = f.charset # 文字種別を取得
  f.read # htmlを読み込んで変数htmlに渡す
end

# htmlをパース(解析)してオブジェクトを作成
doc = Nokogiri::HTML.parse(html, nil, charset)

# 日付
puts doc.xpath('//p[@id="forecast_public_date"]').inner_text

doc.xpath('//ul[@id="forecast_list_entries"]/li/a')[0, 7].each do |node|
  # 場所
  place = node.child.inner_text

  # 天気
  weather = node.css('img').attribute('title').value

  # 降水確率
  probability = node.css('span.probPrecip').inner_text

  puts "#{place}の天気は#{weather}で降水確率は#{probability}です。" 
end

実行結果


05月08日(日)
遠野市の天気は晴で降水確率は0%です。
滝沢市の天気は晴で降水確率は0%です。
紫波町の天気は晴で降水確率は0%です。
平泉町の天気は晴で降水確率は0%です。
岩手町の天気は晴で降水確率は0%です。
岩泉町の天気は晴で降水確率は0%です。
軽米町の天気は晴で降水確率は0%です。

参考

Nokogiri を使った Rubyスクレイピング [初心者向けチュートリアル]

[Ruby]スクレイピングのためのNokogiri利用メモ

position - XPath | MDN