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.020 ]

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

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

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

Leitura recomendada

Redes definidas por Software com Mininet e POX - Criando meu primeiro Controlador

Como criar um bot para curtir e comentar perfis do Instagram

Varredura de PING Utilizando o Python

Port Scanner com Python

Criando Speed Test com Python

  
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