Skip to content

Commit 9b13361

Browse files
committed
Update ceptracker implementation.
1 parent 13d694c commit 9b13361

10 files changed

Lines changed: 179 additions & 71 deletions

File tree

CepTracker.py

Lines changed: 22 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import os
66
import re
77

8-
from lxml.html import fromstring
98
import requests
109

1110
logger = logging.getLogger(__name__)
@@ -15,93 +14,49 @@
1514
class CepTracker(object):
1615
url = os.getenv(
1716
"CORREIOS_CEP_URL",
18-
"http://www.buscacep.correios.com.br/sistemas/buscacep/resultadoBuscaCepEndereco.cfm?t" # NOQA
17+
"https://buscacepinter.correios.com.br/app/endereco/carrega-cep-endereco.php", # NOQA
1918
)
2019

2120
def _request(self, cep):
2221
response = requests.post(self.url, data={
23-
"relaxation": cep,
24-
"Metodo": "listaLogradouro",
25-
"TipoConsulta": "relaxation",
26-
"StartRow": 1,
27-
"EndRow": 10,
22+
"pagina": "/app/endereco/index.php",
23+
"cepaux": "",
24+
"mensagem_alerta": "",
25+
"endereco": cep,
26+
"tipoCEP": "ALL",
2827
}, timeout=10)
2928
try:
3029
response.raise_for_status()
3130
except requests.exceptions.HTTPError as ex:
3231
logger.exception('Erro no site dos Correios')
3332
raise ex
34-
return response.text
35-
36-
def _get_infos_(self, cep):
37-
response = self._request(cep)
38-
html = fromstring(response)
39-
registros = html.cssselect('.tmptabela tr')
40-
41-
if not registros:
42-
return None, []
43-
44-
header = [h.text.strip(':') for h in registros[0].cssselect('th')]
45-
registros = registros[1:]
46-
resultado = []
47-
for item in registros:
48-
td = item.cssselect('td')
49-
line = []
50-
for a in td:
51-
link = a.cssselect('a')
52-
if link:
53-
text = link[0].text
54-
else:
55-
text = a.text
56-
line.append(text)
57-
resultado.append(line)
58-
return header, resultado
33+
return response.json()
5934

6035
def track(self, cep):
61-
header, resultado = self._get_infos_(cep)
36+
data = self._request(cep)
6237
result = []
6338

6439
found = False
6540
now = datetime.now()
6641

67-
for item in resultado:
42+
for item in data["dados"]:
43+
if item['cep'] == cep:
44+
found = True
45+
6846
data = {
6947
"_meta": {
7048
"v_date": now,
71-
}
49+
},
50+
"cep": item['cep'],
51+
"bairro": item['bairro'],
52+
"cidade": item['localidade'],
53+
"estado": item['uf'],
7254
}
73-
74-
for label, value in zip(header, item):
75-
76-
label = label.lower().strip()
77-
value = re.sub(r'\s+', ' ', value.strip())
78-
79-
if 'localidade' in label:
80-
cidade, estado = value.split('/', 1)
81-
data['cidade'] = cidade.strip()
82-
data['estado'] = estado.split('-')[0].strip()
83-
elif 'logradouro' in label:
84-
if ' - ' in value:
85-
logradouro, complemento = value.split(' - ', 1)
86-
data['complemento'] = complemento.strip(' -')
87-
else:
88-
logradouro = value
89-
logradouro = logradouro.strip()
90-
if logradouro:
91-
data['logradouro'] = logradouro
92-
elif label == u'endereço':
93-
# Use sempre a key `endereco`. O `endereço` existe para não
94-
# quebrar clientes existentes. #92
95-
data['endereco'] = data[label] = value
96-
elif 'bairro' in label:
97-
data['bairro'] = value
98-
elif 'cep' in label:
99-
_cep = value.replace('-', '')
100-
if _cep == cep:
101-
found = True
102-
data['cep'] = _cep
103-
else:
104-
data[label] = value
55+
logradouro = item["logradouroDNEC"]
56+
if ' - ' in logradouro:
57+
logradouro, complemento = logradouro.split(' - ', 1)
58+
data['complemento'] = complemento.strip(' -')
59+
data['logradouro'] = logradouro
10560

10661
result.append(data)
10762

README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ Requisitos do ambiente Python
1515
As dependências estão listadas no arquivo requirements.txt.
1616

1717
* requests
18-
* lxml
1918
* pymongo
2019
* bottle
2120
* nosetests

requirements.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
bottle==0.12.7
22
bottle-healthcheck==0.2.1
33
cssselect==1.0.3
4-
lxml==4.3.3
54
pymongo<3
65
packtrack==1.6
76
xmltodict
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
{
2+
"dados": [
3+
{
4+
"bairro": "Bela Vista",
5+
"numeroLocalidade": "",
6+
"situacao": "",
7+
"locNu": "",
8+
"localidadeSubordinada": "",
9+
"cep": "01330000",
10+
"logradouroDNEC": "Rua Rocha",
11+
"locNoSem": "",
12+
"tipoCep": "2",
13+
"faixasCaixaPostal": [],
14+
"logradouroTextoAdicional": "",
15+
"logradouroTexto": "",
16+
"nomeUnidade": "",
17+
"uf": "SP",
18+
"localidade": "S\u00e3o Paulo",
19+
"baiNu": "",
20+
"faixasCep": []
21+
}
22+
],
23+
"total": 1,
24+
"erro": false,
25+
"mensagem": "DADOS ENCONTRADOS COM SUCESSO."
26+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
{
2+
"dados": [
3+
{
4+
"bairro": "Vila Bet\u00e2nia",
5+
"numeroLocalidade": "",
6+
"situacao": "",
7+
"locNu": "",
8+
"localidadeSubordinada": "",
9+
"cep": "12245230",
10+
"logradouroDNEC": "Avenida Tivoli - lado \u00edmpar",
11+
"locNoSem": "",
12+
"tipoCep": "2",
13+
"faixasCaixaPostal": [],
14+
"logradouroTextoAdicional": "",
15+
"logradouroTexto": "",
16+
"nomeUnidade": "",
17+
"uf": "SP",
18+
"localidade": "S\u00e3o Jos\u00e9 dos Campos",
19+
"baiNu": "",
20+
"faixasCep": []
21+
}
22+
],
23+
"total": 1,
24+
"erro": false,
25+
"mensagem": "DADOS ENCONTRADOS COM SUCESSO."
26+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
{
2+
"dados": [
3+
{
4+
"bairro": "",
5+
"numeroLocalidade": "",
6+
"situacao": "",
7+
"locNu": "",
8+
"localidadeSubordinada": "",
9+
"cep": "65930000",
10+
"logradouroDNEC": "",
11+
"locNoSem": "",
12+
"tipoCep": "1",
13+
"faixasCaixaPostal": [],
14+
"logradouroTextoAdicional": "",
15+
"logradouroTexto": "",
16+
"nomeUnidade": "",
17+
"uf": "MA",
18+
"localidade": "A\u00e7ail\u00e2ndia",
19+
"baiNu": "",
20+
"faixasCep": []
21+
}
22+
],
23+
"total": 1,
24+
"erro": false,
25+
"mensagem": "DADOS ENCONTRADOS COM SUCESSO."
26+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
{
2+
"erro": false,
3+
"mensagem": "DADOS ENCONTRADOS COM SUCESSO.",
4+
"total": 1,
5+
"dados": [
6+
{
7+
"uf": "AC",
8+
"localidade": "Rio Branco",
9+
"locNoSem": "",
10+
"locNu": "",
11+
"localidadeSubordinada": "",
12+
"logradouroDNEC": "Rodovia BR-364 (Rio Branco-Porto Velho) - at\u00e9 5014 - lado par",
13+
"logradouroTextoAdicional": "",
14+
"logradouroTexto": "",
15+
"bairro": "Loteamento Santa Helena",
16+
"baiNu": "",
17+
"nomeUnidade": "",
18+
"cep": "69908768",
19+
"tipoCep": "2",
20+
"numeroLocalidade": "",
21+
"situacao": "",
22+
"faixasCaixaPostal": [],
23+
"faixasCep": []
24+
}
25+
]
26+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
{
2+
"dados": [
3+
{
4+
"bairro": "Vila Jayara",
5+
"numeroLocalidade": "",
6+
"situacao": "",
7+
"locNu": "",
8+
"localidadeSubordinada": "",
9+
"cep": "75064590",
10+
"logradouroDNEC": "Rua A - at\u00e9 69/70",
11+
"locNoSem": "",
12+
"tipoCep": "2",
13+
"faixasCaixaPostal": [],
14+
"logradouroTextoAdicional": "",
15+
"logradouroTexto": "",
16+
"nomeUnidade": "",
17+
"uf": "GO",
18+
"localidade": "An\u00e1polis",
19+
"baiNu": "",
20+
"faixasCep": []
21+
},
22+
{
23+
"bairro": "Vila Jayara",
24+
"numeroLocalidade": "",
25+
"situacao": "",
26+
"locNu": "",
27+
"localidadeSubordinada": "",
28+
"cep": "75064379",
29+
"logradouroDNEC": "Rua A - de 109/110 ao fim",
30+
"locNoSem": "",
31+
"tipoCep": "2",
32+
"faixasCaixaPostal": [],
33+
"logradouroTextoAdicional": "",
34+
"logradouroTexto": "",
35+
"nomeUnidade": "",
36+
"uf": "GO",
37+
"localidade": "An\u00e1polis",
38+
"baiNu": "",
39+
"faixasCep": []
40+
}
41+
],
42+
"total": 2,
43+
"erro": false,
44+
"mensagem": "ATEN\u00c7\u00c3O! O CEP 75064-590 FOI DESMEMBRADO CONFORME ABAIXO."
45+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"dados": [],
3+
"total": 0,
4+
"erro": false,
5+
"mensagem": "DADOS NAO ENCONTRADOS"
6+
}

test/postmon_test.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,8 +118,8 @@ def setUp(self):
118118
self.tracker._request = self._request_mock
119119

120120
def _request_mock(self, cep):
121-
with open('test/assets/buscacep/' + cep + '.html') as f:
122-
return f.read().decode('latin-1')
121+
with open('test/assets/buscacepinter/' + cep + '.json') as f:
122+
return json.load(f)
123123

124124

125125
class PostmonWebTest(unittest.TestCase, PostmonBaseTest):

0 commit comments

Comments
 (0)