Introdução
Ano passado publiquei o script campbra.sh que mostrava no terminal a tabela de classificação brasileirão série A de 2011. O problema é que o script não funciona para o campeonato desse ano, pois o formato da página em que os dados eram extraídos foi modificado.
Resolvi modificar o script e torná-lo funcional para o campeonato 2012.
O código
Antes de tudo, postarei o código.
#!/bin/bash # [campbra.sh] # Script que mostra a tabela do campeonato brasileiro # série A. # # [Codificação] # Script: UTF-8 # Saída: UTF-8 (variável CODIFICACAO) # # [Autor] # Marcos Paulo Ferreira (Daemonio) # undefinido gmail com # https://daemoniolabs.wordpress.com # # [Execução] # $ ./campbra.sh # # [Observações] # O script está configurado para mostrar a tabela # do campeonato de 2012. Através da variável SITE_TERRA # você pode apontar para a página de uma tabela de # outro ano. O script irá funcionar somente se o terra # manter o mesmo formato da página. # # + Versão 2011.0, by daemonio @ Thu Jul 7 01:47:27 BRT 2011 # + Versão 2011.1, by daemonio @ Thu Jul 7 11:19:34 BRT 2011 # + Versão 2011.2, by daemonio @ Thu Aug 11 01:37:33 BRT 2011 # - Alteração devido a tag "move up" acrescentada no fonte. # + Versão 2012.0, by daemonio @ Sat Jun 2 10:49:43 BRT 2012 # - Alteração na página de extração de dados. # - Uso do lynx no lugar do wget. # - Reformulação geral do código. # # # Variáveis globais. # # Flag. Valor '1' indica para usar cores. Valor '0' # não usa cores. USARCORES='1' # Codificação usada na saída. Se você estiver com problemas # de caracteres estranhos, é bem provável que o valor # dessa variável esteja trocado. Caso isso ocorra, use o valor # ISO-8859-1. CODIFICACAO='UTF-8' #CODIFICACAO='ISO-8859-1' # Página usada para extrair as informações. SITE_TERRA='http://esportes.terra.com.br/futebol/brasileiro-serie-a' # A página acima será salva nesse arquivo. ARQUIVO_TERRA=/tmp/tabelao$$ # Cores no formato octal. COR_TITULO='1;35m' # Cor padrão: Magenta forte. COR_LIBERTADORES='1;33m' # Cor padrão: Amarelo forte. COR_REBAIXADOS='1;31m' # Cor padrão: Vermelho forte. COR_DEMAIS='1;30m' # Cor padrão: Cinza forte. # # Funções. # # Muda a codificação de saída de acordo com # o valor da variável CODIFICACAO. function mudar_codificacao() { iconv -f UTF-8 -t $CODIFICACAO - } # Trata as cores das saídas. O primeiro # parâmetro é o código da cor. function echocomcor() { local cor="$1" ; shift # Sem cor. if [ "$cor" = '0' ] || [ "$USARCORES" = '0' ] then echo "$*" # Com cor. else echo -e "33[$cor" "$*" '33[m' fi } # Colore posições específicas da tabela. function colorir() { local numerolinha=1 local LINHA local corlinha while read LINHA do if [ "$numerolinha" = '1' ]; then corlinha=$COR_TITULO elif [ "$numerolinha" -lt 6 ]; then corlinha=$COR_LIBERTADORES elif [ "$numerolinha" -gt 17 ]; then corlinha=$COR_REBAIXADOS else corlinha=$COR_DEMAIS fi echocomcor "$corlinha" "$LINHA" let numerolinha++ done } # Essa função "limpa" a tabela retornada # pelo lynx. function gerar_tabela() { local nomeduplicado local indicenome local nometime local LINHA local primeiralinha='1' while read LINHA do if [ "$primeiralinha" = '1' ] then primeiralinha='0' echo "$LINHA" continue fi # Obtém o nome do time. O lynx retorna esse nome duplicado. nomeduplicado=$(echo "$LINHA" | sed 's/^[0-9 ]*\([^>]*\).*/\1/;') # Obtém o índice do nome. indicenome=$(echo "$nomeduplicado" | wc -w) indicenome=$(((indicenome)/2)) # Extrai o nome do time, eliminando a duplicidade. nometime=$(echo "$nomeduplicado" | cut -f1-"$indicenome" -d ' ' | tr ' ' '_') # Mostra o nome do time. echo -n "$nometime " # Mostra o restante da linha, após o nome do time. echo "$LINHA" | sed 's/^[^>]*>>//' done } # # Main # # Baixando ... echo '[+] Baixando a pagina da tabela do brasileirao... Espere.' # O lynx dá dump na página e retorna a tabela de classificação # já pronta, porém com o nome de cada time duplicado. O (GNU) sed # filtrará somente essa tabela e a função gerar_tabela eliminará # a duplicidade de nomes. O comando column formata a tabela, o tr # troca o '_' por espaço e o nl numera as linhas começando do zero. lynx -dump -nolist -width=300 -accept_all_cookies \ -display_charset=UTF-8 "$SITE_TERRA" | sed -n '/^\s*Times\s*P\s*J/,+20p' | gerar_tabela | mudar_codificacao | colorir | column -t | tr '_' ' ' | nl -v0 #EOF
Para executar o script basta fornecer o seu nome.
$ chmod +x campbra.sh $ ./campbra.sh [+] Baixando a pagina da tabela do brasileirao... Espere. 0 Times P J V E D GP GC SG % 1 Botafogo 6 2 2 0 0 7 4 3 100 2 Vasco 6 2 2 0 0 3 1 2 100 3 Atlético-MG 6 2 2 0 0 2 0 2 100 4 Internacional 4 2 1 1 0 5 3 2 66 5 Figueirense 4 2 1 1 0 4 3 1 66 6 Fluminense 4 2 1 1 0 3 2 1 66 7 Grêmio 3 2 1 0 1 2 2 0 50 8 São Paulo 3 2 1 0 1 3 4 -1 50 9 Flamengo 2 2 0 2 0 4 4 0 33 10 Atlético-GO 2 2 0 2 0 1 1 0 33 11 Sport 2 2 0 2 0 1 1 0 33 12 Cruzeiro 2 2 0 2 0 0 0 0 33 13 Santos 2 2 0 2 0 0 0 0 33 14 Palmeiras 1 2 0 1 1 1 2 -1 16 15 Portuguesa 1 2 0 1 1 1 2 -1 16 16 Ponte Preta 1 2 0 1 1 1 2 -1 16 17 Náutico 1 2 0 1 1 1 2 -1 16 18 Bahia 1 2 0 1 1 0 1 -1 16 19 Corinthians 0 2 0 0 2 0 2 -2 0 20 Coritiba 0 2 0 0 2 2 5 -3 0 # OBS: Tabela gerada em 02/06/2012
Por padrão, a saída do script é colorida. Setando a variável USARCORES para zero, a saída será limpa, sem uso de cores.
Problemas com caracteres estranhos
Se você executou o script e percebeu que os nomes de alguns times apresentam caracteres estranhos, então você está usando uma codificação diferente da UTF-8, provavelmente a ISO-8859-1.
Para resolver esse problema você deve trocar de codificação e tudo que você precisa fazer é alterar o conteúdo da variável CODIFICACAO (na linha 50 do script), para isso comente a linha referente a UTF-8 e descomente a linha referente a ISO-8859-1.
#CODIFICACAO='UTF-8' CODIFICACAO='ISO-8859-1'
Detalhes de implementação
Eu praticamente reescrevei o campbra.sh, pois adotei o uso do lynx em relação ao wget. Com o wget eu obtinha o código fonte da página e a partir daí eu montava a tabela. Já com o lynx é bem mais fácil, pois o programa já nos retorna a tabela e o único trabalho do script é ajustá-la. Por curiosidade, se você deseja ver a tabela gerada pelo lynx, digite:
$ SITE_TERRA='http://esportes.terra.com.br/futebol/brasileiro-serie-a' $ lynx -dump -nolist -width=300 -accept_all_cookies \ -display_charset=UTF-8 "$SITE_TERRA" | sed -n '/^\s*Times\s*P\s*J/,+20p' Times P J V E D GP GC SG % 1 Botafogo Botafogo >> 6 2 2 0 0 7 4 3 100 2 Vasco Vasco >> 6 2 2 0 0 3 1 2 100 3 Atlético-MG Atlético-MG >> 6 2 2 0 0 2 0 2 100 4 Internacional Internacional >> 4 2 1 1 0 5 3 2 66 5 Figueirense Figueirense >> 4 2 1 1 0 4 3 1 66 6 Fluminense Fluminense >> 4 2 1 1 0 3 2 1 66 7 Grêmio Grêmio >> 3 2 1 0 1 2 2 0 50 8 São Paulo São Paulo >> 3 2 1 0 1 3 4 -1 50 9 Flamengo Flamengo >> 2 2 0 2 0 4 4 0 33 10 Atlético-GO Atlético-GO >> 2 2 0 2 0 1 1 0 33 11 Sport Sport >> 2 2 0 2 0 1 1 0 33 12 Cruzeiro Cruzeiro >> 2 2 0 2 0 0 0 0 33 13 Santos Santos >> 2 2 0 2 0 0 0 0 33 14 Palmeiras Palmeiras >> 1 2 0 1 1 1 2 -1 16 15 Portuguesa Portuguesa >> 1 2 0 1 1 1 2 -1 16 16 Ponte Preta Ponte Preta >> 1 2 0 1 1 1 2 -1 16 17 Náutico Náutico >> 1 2 0 1 1 1 2 -1 16 18 Bahia Bahia >> 1 2 0 1 1 0 1 -1 16 19 Corinthians Corinthians >> 0 2 0 0 2 0 2 -2 0 20 Coritiba Coritiba >> 0 2 0 0 2 2 5 -3 0
O sed irá filtrar somente a tabela, excluindo o conteúdo restante da página. O endereço usado no comando sed só é válido para o GNU sed, então verifique se é esse que você tem instalado ($sed -v).
Repare que na saída do lynx os nomes dos times estão duplicados. A função gerar_tabela do campbra.sh é responsável por eliminar essa duplicidade. Feito isso, a nova tabela é formatada com o comando column e numerada com o comando nl. Esses procedimentos são bem mais simples do que aqueles feitos no código antigo do script.
Referências
[1] Campbra.sh: Tabela do Campeonato Brasileiro no Terminal, by Daemonio (Acessado em: Junho/2012)
https://daemoniolabs.wordpress.com/2011/07/18/campbra-sh-tabela-do-campeonato-brasileiro-no-terminal/