Python: automatizando a extração de informações na web com expressões regulares

Presenciamos uma grande necessidade e valorização de soluções para recuperação, filtragem e organização de informações da Internet. O presente artigo pretende ilustrar, de forma didática, como automatizar a obtenção de informações dinâmicas em páginas web utilizando a linguagem Python e seu amplo suporte a expressões regulares.

[ Hits: 88.883 ]

Por: Rafael José de Alencar Almeida em 16/09/2009 | Blog: http://www.rafael-labs.com


Obtendo informações sobre o tempo em uma cidade brasileira



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!'

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. O módulo urllib2
   3. O módulo re
   4. Obtendo informações sobre o tempo em uma cidade brasileira
   5. Obtendo a última postagem de um perfil no Twitter
   6. Realizando o download de uma imagem dinâmica
   7. Obtendo o resultado de buscas no Google
   8. Conclusão
Outros artigos deste autor

Esteganografia e Esteganálise: transmissão e detecção de informações ocultas em imagens digitais

Automatizando a criação de uma base de conhecimento em Prolog para gerenciar os acessos a um site

Leitura recomendada

Reconhecimento de placas de veículos com OpenALPR

Introdução ao clib (Command Line Book)

Clicador automático de Tinder com Python

Criando um leitor de RSS com Python

Crie um bot para Telegram e gerencie a escala de plantonistas

  
Comentários
[1] Comentário enviado por valdineisantos em 16/09/2009 - 16:21h

Muito bom seu texto. Como você comentou o BeautifulSoap é bastante util eu sempre procuro pelos elementos da página com ele e não com expressões regulares embora o resultado final seja exatamente o mesmo.

Parabens.

[2] Comentário enviado por wryel em 16/09/2009 - 17:35h

eu fiz essas coisas com o curl do linux uns tempos atras, cheguei a achar a lib pycurl na net mas não tava conseguindo importar pra dentro dos projetos ;|

maior mão na roda seu tutorial =0

[3] Comentário enviado por forkd em 17/09/2009 - 10:17h

Excelente artigo, parabéns!

Poxa, legal ver mais alguém de Barbacena por aqui!
Como eu, é entusiasta de Linux e Python!
Mande um abraço pro prof. Herlon lá na EAFB!

Abraço!

[4] Comentário enviado por jmurray em 26/08/2010 - 09:34h

Era somente isso que faltava para mim migrar para o Linux por definitivo. O que me prende no Windows era a automatização de tarefas para a internet !

[5] Comentário enviado por iKaleo em 09/03/2016 - 15:45h

Estou aprendendo python e php sei uma base por cima também , precisava criar um script em python ou outra se alguem conseguir me ajuda . O programa tem que amarzena um url exemplo var=web.browser.open(http://www.empresa.com.br) quero que quando o usuario digite o site que é empresa e o python vai ficar rodando em segundo plano , assim que o cliente acessar o link ele sera automaticamete rederecionado para meu outro site para ter um controle . alguem tem algum ideia de como posso fazer isso ?


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts