Este exemplo obtém a condição climática atual em uma cidade informada pelo usuário a partir do site
Tempo Agora. Um recurso web interessante que lida com a obtenção dinâmica de informações climáticas é o tema "Árvore" do
Gmail, que modifica o plano de fundo do e-mail de acordo com o tempo em uma determinada cidade.
1. Definindo a codificação e importando os módulos necessários:
Para permitir acentos e outros caracteres especiais, a primeira linha do programa deve especificar a codificação, que no caso será UTF-8:
#coding: UTF-8
Logo em seguida serão importados os módulos necessários para conexão web e para o uso de expressões regulares:
import urllib2, re
2. Obtendo a URL:
A URL da página com a previsão do tempo para uma determinada cidade é montada, no site Tempo Agora, da seguinte forma:
http://tempoagora.uol.com.br/previsaodotempo.html/brasil/NomeDaCidade-ESTADO
É importante observar que palavras compostas são inseridas sem espaços, na forma "JuizdeFora", e as letras maiúsculas e minúsculas devem ser respeitadas.
Assim, o primeiro passo do programa será solicitar ao usuário o nome da cidade e o estado, e garantir a correta formatação dos mesmos:
site = 'http://tempoagora.uol.com.br/previsaodotempo.html/brasil/'
cidade = raw_input('Forneça o nome da cidade: ')
estado = raw_input('Forneça a sigla do estado: ')
#Remove os espaços que possam existir em um nome de cidade composto
cidade = cidade.replace(' ' , '')
#Aborta a execução caso a sigla do estado tenha mais de dois caracteres
if len(estado) != 2:
print '\nA sigla do estado deve ter duas letras!\n'
exit(1)
#Formata a URL da cidade, garantindo que as siglas do estado serão maiúsculas
url = site + cidade + '-' + estado.upper()
3. Estabelecendo a conexão:
print ' > Conectando-se a %s...' % url
#Estabelece a conexão, com timeout de 5 segundos
con = urllib2.urlopen(url , None , 5)
print ' > Conexão estabelecida. Obtendo código HTML...'
#Obtém o código HTML
HTML = con.read()
4. Obtendo as informações:
print ' > Filtrando informações...\n'
#Valida a página buscando o padrão "cidade - estado", que só é exibido em páginas válidas
#EXEMPLO HTML: Barbacena - MG
if re.search(r'[A-Z][^-]+- [A-Z]{2}' , HTML) == None:
print 'Cidade inválida!\n'
exit(1)
#Busca a condição climática, que é informada entre os fragmentos de tags %;\"> e <
#EXEMPLO HTML: <div style="float:left; width:450px; height:100%;">Predomínio de sol, apenas com pouca variação de nuvens</div>
status = re.search(r'%;\">(.*?)<' , HTML)
#Obtém a data e a hora da última atualização
#EXEMPLO HTML: <p>Atualizado em: 14/09/2009 @ 20:30:00</p>
atualizado = re.search(r'Atualizado em: .*[0-9]' , HTML)
5. Exibindo o resultado:
print '*** CONDIÇÃO CLIMÁTICA EM %s - %s ***' % (cidade.upper() , estado.upper())
print status.group(1)
print atualizado.group(0) , '\n'
6. Tratando exceções:
Caso a conexão não possa ser estabelecida ou o timeout se encerre, será disparada uma exceção do tipo
URLError. Para tratá-la, o código dos itens 3 a 5 devem ficar dentro do bloco:
try:
#Código aqui
except urllib2.URLError:
print '> Falha na conexão!'