Created
September 30, 2014 22:24
-
-
Save danilovazb/e768c094235c3a0ebbbe to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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