class FloripaPublicTransit::BusCrawler
Constants
- GOING
- PERIODS
- RETURNING
Attributes
bus_line_number[R]
Public Class Methods
new(bus_line_number)
click to toggle source
# File lib/floripa/bus_crawler.rb, line 19 def initialize(bus_line_number) @bus_line_number = bus_line_number end
Public Instance Methods
fetch()
click to toggle source
# File lib/floripa/bus_crawler.rb, line 23 def fetch name = fetch_name() operator = fetch_operator() itinerary = fetch_itinerary() schedule = fetch_schedule(itinerary) Bus.new(bus_line_number, name, operator, itinerary, schedule) end
Private Instance Methods
fetch_hours(direction, itinerary)
click to toggle source
# File lib/floripa/bus_crawler.rb, line 61 def fetch_hours(direction, itinerary) data = request_data direction, 'iso8859-1' if direction == GOING targets = data.css('#conteudo_horaida b:first-child').first.content.scan(/([\w|\s]+)/).flatten.map &:strip @origin = targets[0] @destination = targets[1] end if !@origin || @origin && @origin.empty? @origin = itinerary[direction == GOING ? 0 : itinerary.length-1] @destination = itinerary[direction == GOING ? itinerary.length-1 : 0] end origin = direction == GOING ? @origin : @destination destination = direction == GOING ? @destination : @origin data.css('.conteudo_abas_ext tr:last-child td').map.with_index do |period, index| hours = period.to_s.split('<br>').map do |hour| match = hour.match(/(\d\d:\d\d)/) match && match[0] end.compact Schedule.new(PERIODS[index], hours, direction == GOING ? 'going' : 'returning', origin, destination) end end
fetch_itinerary()
click to toggle source
# File lib/floripa/bus_crawler.rb, line 44 def fetch_itinerary data = request_data '3' data.css('#conteudo_itinerario li').map do |address| address.content.gsub('ยป ', '').strip end end
fetch_name()
click to toggle source
# File lib/floripa/bus_crawler.rb, line 36 def fetch_name request_data('1', 'iso8859-1').css('#titulo_pagina').first.content.gsub(/\(.+\)/, '').strip end
fetch_operator()
click to toggle source
# File lib/floripa/bus_crawler.rb, line 40 def fetch_operator request_data('1', 'iso8859-1').css('#cabecalho_onibus_linha h4').first.content.gsub('Empresa:', '').strip end
fetch_schedule(itinerary)
click to toggle source
# File lib/floripa/bus_crawler.rb, line 52 def fetch_schedule(itinerary) going_schedule = fetch_hours(GOING, itinerary) returning_schedule = fetch_hours(RETURNING, itinerary) [going_schedule, returning_schedule].flatten.select do |schedule| schedule.hours.length > 0 end end
request_data(direction, encoding = 'utf-8')
click to toggle source
# File lib/floripa/bus_crawler.rb, line 88 def request_data(direction, encoding = 'utf-8') url = "http://www.pmf.sc.gov.br/servicos/index.php?pagina=onibuslinha&idLinha=#{bus_line_number}" uri = URI.parse(url) http = Net::HTTP.new(uri.host, uri.port) request = Net::HTTP::Post.new(uri.request_uri) request.set_form_data({ 'passoGeral' => direction }) response = http.request(request) Nokogiri::HTML(response.body, nil, encoding) end