O documento descreve como construir um webcrawler para rastrear encomendas usando Python e expressões regulares. Primeiro, ele explica como fazer o download da página HTML com os dados de rastreamento e extrair o conteúdo. Depois, ele discute como analisar o HTML baixado usando expressões regulares para obter as informações de status e localização da encomenda.
2. O que são webcrawlers ?
WebCrawlers
são
programas
de
computador
que
percorrem
a
internet
de
forma
automa>zada
e
metódica.
Também
chamados
de
bots
ou
spiders,
são
muito
u>lizados
em
sites
de
busca
como
Google
para
indexar
as
páginas
web
em
sua
base
de
dados.
Arquitetura
de
um
WebCrawler
Python
Aula
Extra
2
3. O que são expressões regulares ?
Chamado
também
de
regex
ou
regexp
Ferramenta
eficiente
para
processamento
de
palavras
em
texto
por
meio
de
casamento
de
padrões
Linguagem
formal
que
pode
ser
interpretada
por
um
processador
de
expressões
regulares
ou
por
um
programa
que
iden>fica
partes
do
texto
que
“casam”
com
uma
especificação
provida.
-‐
Wikipedia
Python
Aula
Extra
3
4. O que são expressões regulares ?
Também
podemos
afirmar
que
é:
• Uma
maneira
de
procurar
um
texto
que
você
não
lembra
exatamente
como
é,
mas
tem
ideia
das
variações
possíveis;
• Uma
maneira
de
procurar
um
trecho
em
posições
específicas
como
no
começo
ou
no
fim
de
uma
linha,
ou
palavra;
• Uma
maneira
de
um
programador
especificar
padrões
complexos
que
podem
ser
procurados
e
casados
em
uma
cadeia
de
caracteres;
Python
Aula
Extra
4
5. Expressões Regulares
Representação formal de um autômato finito, com o objetivo de
determinar um padrão de texto.
^[0-9]+. [0-9]*|. [0-9]+$
Leitura atômica da esquerda para a direita
Python
Aula
Extra
5
6. Onde são aplicados ?
Busca
ou
validação
de
um
padrão
de
texto
que
pode
ser
variável
como
datas,
horários,
números
IP,
endereços,
dados
de
uma
coluna
N
de
texto,
dados
que
estão
entre
tags,
RG,
CPF,
cartão
de
crédito,
etc.
Como
achar
apenas
os
usuários
que
05:15
ernesto
acessaram
o
sistema
08:39
ricardo
No
período
da
tarde
(meio-‐dia
às
6)
?
10:32
patricia
14:59
gabriel
Resposta:
^1[2-‐8]
16:27
carla
22:23
marcelo
Python
Aula
Extra
6
7. Construindo um Crawler - Correios
Os
Correios
brasileiro
possui
um
website
que
provê
o
rastreamento
de
encomendas
via
sedex,
carta
registrada,
pac,
etc.
Este
site
é
gratuito
e
informa
o
status
atual
da
encomenda,
isto
é,
se
já
foi
entregue,
se
já
foi
enviado
e
por
qual
localidade
ou
agência
se
encontra.
Python
Aula
Extra
7
8. Nesta aula aprenderemos
Como
podemos
construir
um
simples
webcrawler
usando
expressões
regulares
para
rastreamento
de
encomendas
usando
Python.
Python
Aula
Extra
8
9. Disclaimer!!
Esta
aula
tem
como
obje>vo
apenas
fins
didá>cos
a
construção
deste
crawler;
De
hipotése
alguma
incen>vamos
o
uso
indevido
ou
PAGO
desta
ferramenta.
Os
dados
são
públicos!!!
N ã o
n o s
r e s p o n s a b i l i z a m o s
p e l o
u s o
inapropriado
deste
crawler.
Recomendo
inclusive
u>lizar
as
ferramentas
fornecidas
pelo
site
oficial
dos
correios
brasileiros;
Python
Aula
Extra
9
10. Construindo o Downloader
O
Primeiro
passo
é
construir
o
mecanismo
de
fazer
o
download
do
resultado
dos
correios
após
a
consulta
do
código
de
rastreamento
como
parâmetro.
hmps://gist.github.com/2866283
Python
Aula
Extra
10
11. Construindo o Downloader
Adicionando
a
extração
do
html
por
meio
do
módulo
urllib
em
python.
hmps://gist.github.com/2866483
Python
Aula
Extra
11
12. Construindo o Downloader
Resultado
da
primeira
etapa:
<table
border
cellpadding=1
hspace=10>
<colgroup
style='font:8pt
Tahoma;color=Black'
valign=top><colgroup
style='font:8pt
Tahoma;
color=Navy'><colgroup
style='font:8pt
Tahoma;color=Maroon'>
<tr>
<td><font
FACE=Tahoma
color='#CC0000'
size=2><b>Data</b></font></td>
<td><font
FACE=Tahoma
c
olor='#CC0000'
size=2><b>Local</b></font></td>
<td><font
FACE=Tahoma
c
olor='#CC0000'
size=2><b>Situa??o</b></font></td>
</tr>
<tr><td
rowspan=1>25/04/2012
17:36</td><td>CDD
CACOAL
-‐
CACOAL/RO</td><td><FONT
COLOR="5F9F9F">Entrega
Efetuada</font></td></tr>
<tr><td
rowspan=1>25/04/2012
09:04</td><td>CDD
CACOAL
-‐
CACOAL/RO</td><td><FONT
COLOR="007FFF">Saiu
para
entrega</font></td></tr>
<tr><td
rowspan=2>23/04/2012
12:46</td><td>CTCE
PORTO
VELHO
-‐
PORTO
VELHO/RO</td><td><FONT
COLOR="000000">Encaminhado</font></td></tr>
<tr><td
colspan=2>Em
tr?nsito
para
CDD
CACOAL
-‐
CACOAL/RO</td></tr>
<tr><td
rowspan=2>19/04/2012
14:55</td><td>CTE
SAUDE
-‐
SAO
PAULO/SP</td><td><FONT
COLOR="000000">Encaminhado</font></td></tr>
<tr><td
colspan=2>Encaminhado
para
CTCE
PORTO
VELHO
-‐
PORTO
VELHO/RO</td></tr>
<tr><td
rowspan=1>18/04/2012
21:38</td><td>CTE
SAUDE/GCCAP
-‐
SAO
PAULO/SP</td><td><FONT
COLOR="000000">Postado</font></td></tr>
<tr><td
rowspan=2>18/04/2012
19:11</td><td>CEE
MOEMA
-‐
SAO
PAULO/SP</td><td><FONT
COLOR="000000">Encaminhado</font></td></tr>
<tr><td
colspan=2>Em
tr?nsito
para
CTE
SAUDE
-‐
SAO
PAULO/SP</td></tr>
</TABLE>
Python
Aula
Extra
12
13. Construindo o Downloader
O
Módulo
re
permite
a
construção
de
expressões
regulares.
O
nosso
obje>vo
é
extrair
a
tabela
com
os
status
das
encomendas.
Retorna
tudo
entre
as
tags
<table>
</TABLE>
hmps://gist.github.com/2872334
Python
Aula
Extra
13
14. Construindo o Downloader
Resultado
da
segunda
etapa:
<table
border
cellpadding=1
hspace=10>
<colgroup
style='font:8pt
Tahoma;color=Black'
valign=top><colgroup
style='font:8pt
Tahoma;
color=Navy'><colgroup
style='font:8pt
Tahoma;color=Maroon'>
<tr>
<td><font
FACE=Tahoma
color='#CC0000'
size=2><b>Data</b></font></td>
<td><font
FACE=Tahoma
c
olor='#CC0000'
size=2><b>Local</b></font></td>
<td><font
FACE=Tahoma
c
olor='#CC0000'
size=2><b>Situa??o</b></font></td>
</tr>
<tr><td
rowspan=1>25/04/2012
17:36</td><td>CDD
CACOAL
-‐
CACOAL/RO</td><td><FONT
COLOR="5F9F9F">Entrega
Efetuada</font></td></tr>
<tr><td
rowspan=1>25/04/2012
09:04</td><td>CDD
CACOAL
-‐
CACOAL/RO</td><td><FONT
COLOR="007FFF">Saiu
para
entrega</font></td></tr>
<tr><td
rowspan=2>23/04/2012
12:46</td><td>CTCE
PORTO
VELHO
-‐
PORTO
VELHO/RO</td><td><FONT
COLOR="000000">Encaminhado</font></td></tr>
<tr><td
colspan=2>Em
tr?nsito
para
CDD
CACOAL
-‐
CACOAL/RO</td></tr>
<tr><td
rowspan=2>19/04/2012
14:55</td><td>CTE
SAUDE
-‐
SAO
PAULO/SP</td><td><FONT
COLOR="000000">Encaminhado</font></td></tr>
<tr><td
colspan=2>Encaminhado
para
CTCE
PORTO
VELHO
-‐
PORTO
VELHO/RO</td></tr>
<tr><td
rowspan=1>18/04/2012
21:38</td><td>CTE
SAUDE/GCCAP
-‐
SAO
PAULO/SP</td><td><FONT
COLOR="000000">Postado</font></td></tr>
<tr><td
rowspan=2>18/04/2012
19:11</td><td>CEE
MOEMA
-‐
SAO
PAULO/SP</td><td><FONT
COLOR="000000">Encaminhado</font></td></tr>
<tr><td
colspan=2>Em
tr?nsito
para
CTE
SAUDE
-‐
SAO
PAULO/SP</td></tr>
</TABLE>
Python
Aula
Extra
14
15. Construindo o Downloader
Mas
precisamos
extrair
estas
linhas
<table
border
cellpadding=1
hspace=10>
<colgroup
style='font:8pt
Tahoma;color=Black'
valign=top><colgroup
style='font:8pt
Tahoma;
color=Navy'><colgroup
style='font:8pt
Tahoma;color=Maroon'>
<tr>
<td><font
FACE=Tahoma
color='#CC0000'
size=2><b>Data</b></font></td>
<td><font
FACE=Tahoma
c
olor='#CC0000'
size=2><b>Local</b></font></td>
<td><font
FACE=Tahoma
c
olor='#CC0000'
size=2><b>Situa??o</b></font></td>
</tr>
<tr><td
rowspan=1>25/04/2012
17:36</td><td>CDD
CACOAL
-‐
CACOAL/RO</td><td><FONT
COLOR="5F9F9F">Entrega
Efetuada</font></td></tr>
<tr><td
rowspan=1>25/04/2012
09:04</td><td>CDD
CACOAL
-‐
CACOAL/RO</td><td><FONT
COLOR="007FFF">Saiu
para
entrega</font></td></tr>
<tr><td
rowspan=2>23/04/2012
12:46</td><td>CTCE
PORTO
VELHO
-‐
PORTO
VELHO/RO</
td><td><FONT
COLOR="000000">Encaminhado</font></td></tr>
<tr><td
colspan=2>Em
tr?nsito
para
CDD
CACOAL
-‐
CACOAL/RO</td></tr>
<tr><td
rowspan=2>19/04/2012
14:55</td><td>CTE
SAUDE
-‐
SAO
PAULO/SP</td><td><FONT
COLOR="000000">Encaminhado</font></td></tr>
<tr><td
colspan=2>Encaminhado
para
CTCE
PORTO
VELHO
-‐
PORTO
VELHO/RO</td></tr>
<tr><td
rowspan=1>18/04/2012
21:38</td><td>CTE
SAUDE/GCCAP
-‐
SAO
PAULO/SP</
td><td><FONT
COLOR="000000">Postado</font></td></tr>
<tr><td
rowspan=2>18/04/2012
19:11</td><td>CEE
MOEMA
-‐
SAO
PAULO/SP</td><td><FONT
COLOR="000000">Encaminhado</font></td></tr>
<tr><td
colspan=2>Em
tr?nsito
para
CTE
SAUDE
-‐
SAO
PAULO/SP</td></tr>
</TABLE>
Python
Aula
Extra
15
16. Construindo o Parser
O
próximo
passo
é
construirmos
o
parser
que
irá
extrair
os
dados
das
encomendas.
Uma
boa
dica
é
ir
extraindo
por
partes
de
nossa
tabela.
hmps://gist.github.com/2872517
Python
Aula
Extra
16
17. Construindo uma simples Storage - API
Para
armazenamento
vamos
expor
o
status
da
nossa
encomenda
no
formato
JSON
para
ser
disponibilizada
por
exemplo
no
futuro
em
uma
webservice!
hmps://gist.github.com/2872533
Python
Aula
Extra
17
18. Construindo uma simples Storage - API
Resposta
do
script:
$
python
correios.py
PH058838637BR
status
{"data":
"25/04/2012
17:36",
"local":
"CDD
CACOAL
-‐
CACOAL/RO",
"situacao":
"Entrega
Efetuada"}
Python
Aula
Extra
18
19. Extra: Webservice com Flask!
Podemos
construir
rapidamente
um
simples
servidor
web
para
servir
esta
mini
API
REST!
hmps://gist.github.com/2872583
hmp://127.0.0.1:5000/track/PH058838637BR
Flask
é
um
micro-‐framework
web
e
pode
ser
baixado
em
:
hFp://flask.pocoo.org/
Python
Aula
Extra
19