require 'nokogiri' require 'open-uri' # Bom Fetcher Module # ------------------ # Fetches the locations from BoM or updates the location weather # from BoM. module BomFetcher # The source name, and URL to fetch the data from. SOURCE = "bom" URL = "http://www.bom.gov.au/vic/observations/melbourne.shtml" def self.get_location_dom # Opens the HTML document (give it the URL of the HTML file) doc = Nokogiri::HTML(open(URL)) # Fetches the DOM for the locations return doc.css("#tMELBOURNE tbody tr") end # get_locations # ------------- # Deletes all the current locations in the database (if any) and # creates new records with the locations on the HTML page specified by # the URL. def self.get_locations # Delete all locations from the db. Location.delete_all locations = get_location_dom # For each location DOM, scrape the name and create a new # location. locations.each do |location| name = location.css('th a').text location = Location.new(name: name) location.save puts "Location #{name} successfully fetched" end end # get_location_weather # -------------------- # Scrapes the location weather data from the HTML page given by the URL. def self.get_location_weather locations = get_location_dom # For each location DOM, scrape the relevant weather data and then store it # into the database. locations.each do |location| # Initialise a weather data hash weather_data = {} # Get the name of the location name = location.css('th a').text # Get the tag of the location location_tag = location.css('th')[0]["id"] # Get the location data from the database location_data = Location.where(name: name).first # Set the weather data to the relevant values weather_data[:time] = Time.current weather_data[:date] = "#{weather_data[:time].day}-#{weather_data[:time].month}-#{weather_data[:time].year}" weather_data[:curr_temp] = location.css("td").at("td[headers='obs-temp #{location_tag}']").text.to_f weather_data[:dew_point] = location.css("td").at("td[headers='obs-dewpoint #{location_tag}']").text.to_f weather_data[:rainfall] = Rainfall.from9am_mm_to_mmhr(location.css("td").at("td[headers='obs-rainsince9am #{location_tag}']").text.to_f) weather_data[:wind_dir] = location.css("td").at("td[headers='obs-wind obs-wind-dir #{location_tag}']").text weather_data[:wind_speed] = location.css("td").at("td[headers='obs-wind obs-wind-spd-kph #{location_tag}']").text.to_f # Insert the weather data into the database location_data.insert_weather_data(SOURCE, weather_data) end end end