-
Notifications
You must be signed in to change notification settings - Fork 1
/
dataPiratesChallenge.py
99 lines (80 loc) · 2.78 KB
/
dataPiratesChallenge.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# importação de bibliotecas utilizadas
import requests
import json
import re
from pathlib import Path
from bs4 import BeautifulSoup
qtdRow = 110 # nr maximo de rows por requisicao
ufList = ['RS','SC'] # UFs que serao buscadas
data = [] # inicializacao da variavel que guardará o resultado final
base = Path('results') # Path que guardará os resultados em jsonl
base.mkdir(exist_ok=True) # Cria a pasta caso a mesma não exista
# funcao que faz um POST na URL dos correios e retorna o HTML como resultado
def reqFaixaCep(uf, pagini, pagfim):
payload = {'UF': uf, 'qtdrow': qtdRow, 'pagini': pagini, 'pagfim': pagfim}
try:
r = requests.post('http://www.buscacep.correios.com.br/sistemas/buscacep/resultadoBuscaFaixaCEP.cfm', data=payload)
except requests.exceptions.RequestException as e:
print('An error has occurred. Please try again later.')
raise SystemExit(e)
return r
# funcao que retorna o numero maximo de registros do UF em questao
def findMaxRow(uf, startRow, endRow):
page = reqFaixaCep(uf, startRow, endRow)
soup = BeautifulSoup(page.text, 'html.parser')
findMaxRow = soup.find(text=re.compile('1 a 110 de '))
if (findMaxRow):
words = findMaxRow.strip().split()
return words[-1]
else:
return 0
# funcao que busca no HTML todas as informacoes referentes ao CEP disponibilizadas na pagina
# e adiciona em uma lista dicionarios com pares de chave valor
def getCepList(page):
global id
soup = BeautifulSoup(page.text, 'html.parser')
content = soup.find('div', class_='ctrlcontent')
tableRows = content.find_all('tr')
for tableRow in tableRows:
cells = tableRow.findAll('td')
info = {}
info['id'] = id
aux = 0
for cell in cells:
if (aux == 0):
info['Localidade'] = cell.text
elif (aux == 1):
info['Faixa de CEP'] = cell.text
elif (aux == 2):
info['Situação'] = cell.text
elif (aux == 3):
info['Tipo de faixa'] = cell.text
else:
info[aux] = cell.text
aux += 1
if (len(info) > 3):
data.append(info)
id += 1
else:
pass
# loop que passa por todos os index (UFs) na variavel ufList
for uf in ufList:
id = 0
startRow = 1
endRow = 110
maxRow = int(findMaxRow(uf, startRow, endRow))
data = []
page = reqFaixaCep(uf, startRow, endRow)
getCepList(page)
# loop para buscar todas as paginas
while endRow <= maxRow:
startRow = endRow + 1
endRow += qtdRow
page = reqFaixaCep(uf, startRow, endRow)
getCepList(page)
# criando o nome do arquivo json
jsonpath = base / ('faixas_de_cep_' + uf + '.jsonl')
# exporta as faixas de cep encontradas em cada UF para um arquivo .json
with open(jsonpath, 'w', encoding='utf8') as fp:
for item in data:
fp.write(json.dumps(item, ensure_ascii=False) + '\n')