Skip to content

Instantly share code, notes, and snippets.

@manfe
Last active April 10, 2022 20:51
Show Gist options
  • Save manfe/4711727 to your computer and use it in GitHub Desktop.
Save manfe/4711727 to your computer and use it in GitHub Desktop.
Recuperando as Cidades Brasileiras do Site do IBGE utilizando ruby
# encoding: utf-8
require 'rubygems'
require 'mysql2'
require 'pry'
require 'nokogiri'
require 'htmlentities'
require 'open-uri'
require 'active_record'
estados = Hash[ "ac" => "Acre", "al" => "Alagoas", "am" => "Amazonas", "ap" => "Amapá", "ba" => "Bahia", "ce" => "Ceará", "df" => "Distrito Federal", "es" => "Espirito Santo", "go" => "Goiás", "ma" => "Maranhão", "mg" => "Minas Gerais", "ms" => "Mato Grosso do Sul", "mt" => "Mato Grosso", "pa" => "Pará", "pb" => "Paraíba", "pe" => "Pernambuco", "pi" => "Piauí", "pr" => "Paraná", "rj" => "Rio de Janeiro", "rn" => "Rio Grande do Norte", "ro" => "Rondônia", "rr" => "Roraima", "rs" => "Rio Grande do Sul", "sc" => "Santa Catarina", "se" => "Sergipe", "sp" => "São Paulo", "to" => "Tocantins" ]
ActiveRecord::Base.establish_connection(
:adapter => "postgresql",
:host => "localhost",
:database => "brasil",
:username => "postgres",
:password => ""
)
# Limpa a base de dados
connection = ActiveRecord::Base.connection
connection.execute("DELETE FROM cidades")
connection.execute("DELETE FROM estados")
class Cidade < ActiveRecord::Base
belongs_to :estado
end
class Estado < ActiveRecord::Base
has_many :cidades
end
estados.each do |sigla, estado|
Estado.create(:sigla => sigla.upcase, :nome => estado)
end
@estados = Estado.all
@estados.each do |e|
doc = Nokogiri::HTML(open("http://cidades.ibge.gov.br/download/mapa_e_municipios.php?lang=&uf=#{e.sigla}"))
p "Pegando dados do estado de #{e.nome}"
doc = doc.xpath('//*[@id="municipios"]/tbody/tr')
doc.each do |mun|
m = Cidade.new
# Nome
m.nome = mun.children[1].content.gsub("`", "'")
# Codigo IBGE
m.codigo_ibge = mun.children[3].content
# Gentilico
m.gentilico = mun.children[5].content.gsub("`", "'").encode.gsub("’", "").gsub("’", "")
# Populacao 2010
m.populacao_2010 = mun.children[7].content.gsub('.', '')
# Area Territorial 2015 - km²
m.area = mun.children[9].content.gsub('.', '').gsub(',', '.')
# Densidade Demografica
m.densidade_demo = mun.children[11].content.gsub(',', '.')
m.estado_id = e.id
m.save
end
end
p "Total de cidades importadas: #{Cidade.count}"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment