Edited at

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

More than 3 years have passed since last update.

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