CEP pela Shell

1. CEP pela Shell

Rogerio
RogerDez

(usa Outra)

Enviado em 02/03/2020 - 19:39h

Olá galera, tudo bem com vocês?
Sou novo no fórum porém no mundo Linux já estou ficando antigo. Me desculpem, eu acho que copiei o nick de alguém ae....
Eu queria desenvolver uma função na shell para pegar número de CEP pelo nome da rua via o site dos Correios.
Por que o site dos Correios dificulta tanto assim pegar CEPs? Na minha visão, é maldade e abuso de poder dos desenvolvedores. Uma coisa tão útil assim, e sempre foi difícil (eu não sei php), mas agora resolvi tentar e cheguei com a função de Bash mais abaixo.
Mas o fato é que eu queria ver o que precisa melhorar e pedir uma revisão para vocês.. Achei que ficou muito grande para ser uma função?... Já dava para fazer um script. Rs..
Vocês tem alguma dica? Como pretendo fazer um vídeo não sei quando para mostrar aos meus inscritos essa utilidade, eu queria ver se ela não está muito esdrúxula.
Por exemplo, eu inseri uma opção para procurar por resultados Semelhantes, mas como implmentei, o user terá que definir a variável SEM para qq coisa que não seja vazio... Será que não é melhor um getopt? Um usuário iniciante/intermediário saberia usar por exemplo a opção para função de shell tipo 'cep -s <nome da rua>'? Ou é melhor nem oferecer essa opção? Outra coisa, o fazer uma tabela com o 'column' já não chega a ser demais?
Obrigado

ver cod nas respostas


  


2. Re: CEP pela Shell

Perfil removido
removido

(usa Nenhuma)

Enviado em 02/03/2020 - 22:40h

Porque não usa o ViaCEP?
cep='01001000'
# pega o bairro
curl -s "https://viacep.com.br/ws/${cep}/json/" | grep \"bairro\" | cut -f2 -d: | sed 's/\"//g;s/,//g;s/\ //g'



3. Re: CEP pela Shell

Rogerio
RogerDez

(usa Outra)

Enviado em 02/03/2020 - 23:39h

Valeu a dica.. Andei procurando a respeito do assunto, e achei muitas discussões do por que não liberam a base de dados para nós. São tratados como segredos de comércio.. O que não faz sentido.. Os correios acabam vendendo a base de dados e depois milhares de correspondências ou encomendas são preenchidas com dados desatualizados ou errados mesmo por causa de alguma base de dados pirata...
E então surgiram esses APIs como alternativa. O meu caso é um pouco diferente, gostaria de inserir o nome da rua e obter o cep.
Eu dei uma melhorada no código do sed, já atualizei o tópico, e estou achando que tem que ser uma gambiarra mesmo.
Estou me convencendo que não há muito o que pode ser feito.

A dica é boa por que possibilita puxar as informações da localidade informando-se o número de cep. Também agradeço a dica de sintaxe de expressões do sed...

Só uma coisa, tem um comando do sed para retirar o non-breaking space de html '& nbsp ;' mas o código do vol come essa parte no código que postei: -e 's/ //g' -e 's/://g'
Código no pastebin: https://pastebin.com/RxbaSK1v

Agradeço.



4. Re: CEP pela Shell

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 03/03/2020 - 00:22h

RogerDez escreveu:

Valeu a dica.. Andei procurando a respeito do assunto, e achei muitas discussões do por que não liberam a base de dados para nós. São tratados como segredos de comércio.. O que não faz sentido.. Os correios acabam vendendo a base de dados e depois milhares de correspondências ou encomendas são preenchidas com dados desatualizados ou errados mesmo por causa de alguma base de dados pirata...
E então surgiram esses APIs como alternativa. O meu caso é um pouco diferente, gostaria de inserir o nome da rua e obter o cep.
Eu dei uma melhorada no código do sed, já atualizei o tópico, e estou achando que tem que ser uma gambiarra mesmo.
Estou me convencendo que não há muito o que pode ser feito.

A dica é boa por que possibilita puxar as informações da localidade informando-se o número de cep. Também agradeço a dica de sintaxe de expressões do sed...

Só uma coisa, tem um comando do sed para retirar o non-breaking space de html '& nbsp ;' mas o código do vol come essa parte no código que postei: -e 's/ //g' -e 's/://g'

Agradeço.


Boa noite Roger.
Segue sugestão:
curl -s 'http://www.buscacep.correios.com.br/sistemas/buscacep/resultadoBuscaCepEndereco.cfm' --data "relaxation=${arg}&tipoCEP=ALL&semelhante=${sem}"|iconv -f iso-8859-1 -t utf-8|sed 's/^M/\n/g'|sed -nr '/^<td/s/<td( width=\".*\")?>|<.td>|&.*$//gp'|paste -sd '\t'

Converte para utf-8 => iconv -f iso-8859-1 -t utf-8
Converte o fim de linha => sed 's/^M/\n/g'
Pega os dados => sed -nr '/^<td/s/<td( width=\".*\")?>|<.td>|&.*$//gp'
Tudo numa linha => paste -sd '\t'
Obs.: Somente funciona para Logradouros com um único CEP....
Faça um teste com a Avenida Paulista . . . Retornou 50 registros.....
Segue:
curl -s 'http://www.buscacep.correios.com.br/sistemas/buscacep/resultadoBuscaCepEndereco.cfm' --data "relaxation=Avenida+paulista&tipoCEP=ALL&semelhante=${sem}"|iconv -f iso-8859-1 -t utf-8|sed 's/^M/\n/g' > Av_Paulista

sed -nr '/^<td/s/<td( width=\".*\")?>?|<.td>|&.*$//gp' Av_Paulista|sed -r 's/[0-9]{5}-[0-9]{3}/&\n/'|awk 'BEGIN{FS="\n";RS="\n\n";ORS="\n\n"} {print NR,$0}'
____________________________________________________________________
Importante: echo -e "\n$(lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p')\n"
Att.: Marcelo Oliver
______________________________________________________________________


5. Re: CEP pela Shell

Rogerio
RogerDez

(usa Outra)

Enviado em 03/03/2020 - 01:34h

Dei umas tentadas nas dicas do msoliver, mas principalmente aquele sed -nr '/^<td/s/<td( width=\".*\")?>|<.td>|&.*$//gp' e outras manhas para limpar os dados não tive resultado aqui.

Acredito que se for escrutinar mais os comandos, conseguirei mais resultados. De qualquer forma, consegui usar uma dicas, e ótimas observações, e a função de Bash está virando um script, praticamente..

Coloquei um loop e agora vai fazer listas com mil e poucos resultados para 'Avenida Paulista', e usando a recomendação do iconv do msoliver para limpar os dados recebidos.

#cep dos correios
#por nome de rua ou cep
cep() { (
[[ -z "${*}" ]] && cat <<-! && return
Puxar CEP dos Correios
Não utilize acentos, n. de casa/apto/lote/prédio ou abreviações.
Para pesquisar por resultados semelhantes, defina SEM=1.
Exs: ${0} 07140-190
${0} Rua Higienopolis Guarulhos
SEM=1 ${0} rua higienopolis
!

#parâmetros
pvar=90; pini=1; pfim="${pvar}"
#retirar acentos e espaços em branco
arg="$(iconv -f utf-8 -t ascii//translit <<<"${*}" | sed 's/\s/+/g')"
#resultados semelhantes?
[[ -n "${SEM}" ]] && sem=S || sem=N

#definir sub-funções
#formatar tabela
colf() { column -dts$'\t' -N1,2,3,4 -T1,2,3;}
#puxar página e limpeza
resf() { res="$(curl -Ls 'http://www.buscacep.correios.com.br/sistemas/buscacep/resultadoBuscaCepEndereco.cfm' --data "relaxation=${arg}&tipoCEP=ALL&semelhante=${sem}&qtdrow=${pvar}&pagini=${pini}&pagfim=${pfim}" | iconv -f iso-8859-1 -t utf-8 | grep -aF 'CEP:' | sed -e 's/<td>/&\t/g' -e 's/">/&\t/g' -e 's/<[^>]*>//g' -e 's/\r\r/ /g' -e 's/\r//g' -e 's/\s\s/\n/g' -e 's/&nbsp;//g' -e 's/://g' | sed -e ':a;N;s/\n\(.\)/ \1/;ta' -e 's/^\s\s*//' -e '/\[\s/d')";}

#procurar resultados semelhantes?
[[ "${sem}" = S ]] && printf 'Buscando por resultados semelhantes..\n' 1>&2

#montar tabelas
if resf; [[ -n "${res}" ]]; then
#primeira tabela
colf <<<"${res}"
#mais resultados?
while (($(awk NF <<<"${res}" | wc -l)>=91)) 2>/dev/null; do
pini=$((pini+pvar)); pfim=$((pfim+pvar))
resf; colf <<<"${res}"
done
elif [[ "${sem}" = S ]]; then
printf 'Nenhum resultado\n' 1>&2
return 1
else
SEM=1 "${0}" "${@}"
fi
);}



6. Re: CEP pela Shell

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 03/03/2020 - 02:45h


RogerDez escreveu:

Dei umas tentadas nas dicas do msoliver, mas principalmente aquele sed -nr '/^<td/s/<td( width=\".*\")?>|<.td>|&.*$//gp' e outras manhas para limpar os dados não tive resultado aqui.

Acredito que se for escrutinar mais os comandos, conseguirei mais resultados. De qualquer forma, consegui usar uma dicas, e ótimas observações, e a função de Bash está virando um script, praticamente..

Coloquei um loop e agora vai fazer listas com mil e poucos resultados para 'Avenida Paulista', e usando a recomendação do iconv do msoliver para limpar os dados recebidos.

No Pastebin: https://pastebin.com/N70hDTMT

Roger, para "escrever o "^M"
no comando sed, faça:
CTRL+V depois CTRL+M
Bem provável que esse é o motivo pq não deu certo....

______________________________________________________________________
Importante: echo -e "\n$(lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p')\n"
Att.: Marcelo Oliver
______________________________________________________________________






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts