LoginSignup
9
9

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-05-07

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

https://gyazo.com/e403ed6a66a8a7b0677139df84c91869

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

実装

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

9
9
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9