campbra.sh : Tabela Brasileirão Série A No Terminal

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/

Deixe um comentário