Skip to content

Instantly share code, notes, and snippets.

@danilovazb
Created September 30, 2014 22:24
Show Gist options
  • Save danilovazb/e768c094235c3a0ebbbe to your computer and use it in GitHub Desktop.
Save danilovazb/e768c094235c3a0ebbbe to your computer and use it in GitHub Desktop.
#!/usr/bin/python
import urllib2
from bs4 import BeautifulSoup
# Abre a pagina principal do IBGE onde contem os links para os estados.
html = urllib2.urlopen('http://cidades.ibge.gov.br/xtras/home.php').read()
# Pega o conteudo da pagina em HTML e joga para o BeautifulSoup mapear as tags
soup = BeautifulSoup(html)
# Apenas um contador para verificar se o loop esta correto e pegando os 27 estados do pais
a = 1
# For, pegando os links. Ele busca no codigo HTML todas as tags que comecam com "<a"
# exemplo: <a href="../xtras/uf.php?lang=&coduf=12&search=acre" title="Acre">AC</a></li>
# Ele vai buscar todo o conteudo de tags de links
for link in soup.find_all('a'):
# Aqui podemos ver tambem que ele faz um get para pegar o conteudo da href
# ou seja, o que estiver entre aspas em href ele vai trazer como texto.
# no caso do exemplo acima, ele vai trazer ../xtras/uf.php?lang=&coduf=12&search=acre
pagina = link.get('href')
# Eu coloquei esse IF para distinguir as URLs, assim ele me traz apenas as URLs
# que contem uf.php que eh o que nos interessa para pegar os estados.
if "uf.php" in pagina:
# Aqui foi feito um "pulo do gato" para conseguir extrair o conteudo e fazer uma juncao
# com a pagina principal para acessar o link, note que ele traz "../xtras/uf.php?lang=&coduf=12&search=acre"
# o que eu fiz foi fazer um split para separar em um vetor tudo que vem antes de "xtras/" e depois dele.
# Assim pegamos apenas o final e concatenamos com o link certo da pagina.
paginaUF = pagina.split('xtras/')[1]
# Na variavel abaixo e feita a concatenacao.
urlUF = "http://cidades.ibge.gov.br/xtras/"+paginaUF
# Aqui nos abrimos uma nova pagina com o conteudo coletado, assim fica automatico
# a navegacao nos links de estados.
htmlUF = urllib2.urlopen(urlUF).read()
# Agora, fiz basicamente o que esta la em cima no codigo.
# eu estou filtrando novamente os links, mas agora das paginas dos estados
soupUF = BeautifulSoup(htmlUF)
print urlUF
for link in soupUF.find_all('a'):
paginaMun = link.get('href')
# Adicionei o TRY para tratar os erros que podem dar, assim ele nao para o programa em tempo de execucao
try:
# Um novo IF, agora ele verifica se perfil.php contem no link da pagina, exatamente como o acima.
# Lembra que visualizamos na pagina dos estados com o "Inspecionar Elemento" para ver
# algo que pudesse fazer a distincao de links, entao, achei o "perfil.php"
if "perfil.php" in paginaMun and "/estadosat/" not in paginaMun:
# As 3 variaveis abaixo, sao basicamente o que fiz acima, eu seleciono a pagina
# e faco o request no urllib2 e trato com o beautifulsoap
urlMun = "http://cidades.ibge.gov.br/xtras/"+paginaMun
htmlMun = urllib2.urlopen(urlMun).read()
soupMun = BeautifulSoup(htmlMun)
# As variaveis abaixo, sao os dados que queriamos pegar
# com calma vou explicar o que cada funcao do BeautifulSoap que usei faz
# mas a principio, podemos ver que ela cria um vetor com o conteudo
# puxando o resultado.
popu_estimada2014 = soupMun.find_all('td',{'class': 'desc'})[0].get_text()
val_popu_estimada2014 = soupMun.find_all('td',{'class': 'valor'})[0].get_text()
popu_estimada2010 = soupMun.find_all('td',{'class': 'desc'})[1].get_text()
val_popu_estimada2010 = soupMun.find_all('td',{'class': 'valor'})[1].get_text()
uni_territorial = soupMun.find_all('td',{'class': 'desc'})[2].get_text().strip()
val_uni_territorial = soupMun.find_all('td',{'class': 'valor'})[2].get_text()
dens_demografica = soupMun.find_all('td',{'class': 'desc'})[3].get_text()
val_dens_demografica = soupMun.find_all('td',{'class': 'valor'})[3].get_text()
cod_municipio = soupMun.find_all('td',{'class': 'desc'})[4].get_text()
val_cod_municipio = soupMun.find_all('td',{'class': 'valor'})[4].get_text()
gentilico = soupMun.find_all('td',{'class': 'desc'})[5].get_text()
val_gentilico = soupMun.find_all('td',{'class': 'valor'})[5].get_text()
prefeito = soupMun.find_all('td',{'class': 'desc'})[6].get_text()
val_prefeito = soupMun.find_all('td',{'class': 'valor'})[6].get_text()
mun = soupMun.find('title').get_text().split("|")[3].strip()
# Apenas um print para demonstrar como estao saindo as informacoes
# antes de colocar elas em um banco de dados.
print mun + "\n" +\
popu_estimada2014 + ": " + val_popu_estimada2014 + "\n" +\
popu_estimada2010 + ": " + val_popu_estimada2010 + "\n" +\
uni_territorial + ": " + val_uni_territorial + "\n" +\
dens_demografica + ": " + val_dens_demografica + "\n" +\
cod_municipio + ": " + val_cod_municipio + "\n" +\
gentilico + ": " + val_gentilico + "\n" +\
prefeito + ": " + val_prefeito + "\n"
# Uma excessao para caso de erro o programa nao parar.
except Exception:
pass
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment