EN | PT

Bem vindo ao meu porfolio!

Eu soluciono problemas usando código!

Meu nome é Marcelo L. Lotufo. Eu sou desenvolvedor e trabalho na Lotuz. Comecei a programar quando eu tinha 15 anos para que eu pudesse criar mapas de Warcraft 3 e jogos em Flash. Hoje eu uso meus conhecimentos em computação para criar soluções para meus clientes.

Quanto custa?

Usando bash para web scraping

10/11/2020

Um amigo pediu ajuda para pegar alguns dados de uma página web, então eu decidi escrever um pequeno script em bash para fazer o trabaho.

Você deve estar se perguntar por que bash. A ideia era ter a menor quantidade de trabalho para completar o script. Como eu uso Linux, o bash já estava pronto para o serviço, auxiliado de alguns outros programas:

  • curl
  • grep
  • sed
  • printf
  • echo

Outra razão de usar bash ao invés de node.js ou python é que eu gostaria de melhorar meus conhecimentos de bash. Me parece uma ferramenta MUITO útil.

# $# é a variável que guarda o tamanho (length) do vetor de argumentos
# Se o tamanho do vetor de argumentos for menor que 1
if [ "$#" -lt 1 ]; then
  # Ensine como usar o script
  echo "Use o script com pelo menos um ticker. ex.:"
  echo "./miner.sh ticker1 [ticker2 [ticker3...]]"
  exit 1
fi

# Coloque todos os argumentos na variavel TICKERS
TICKERS=$@

# A URL da página para minerar
URL=https://algo.com.br/algumacoisa/

# Cabeçalhos em texto para imprimirmos os dados
headers=( \
  "VAL P" \
  "DY CAGR 3a" \
  "AVG. 24m" \
)

# Imprimir os os cabeçalhos dos dados
printf "%10s\t%10s\t%20s\t%20s" "TICKER" "${headers[0]}" "${headers[1]}" "${headers[2]}"
echo

# Para cada ticker passado como argumento
for TICKER in $TICKERS; do
  # Pegue a página como texto, e passe para...
  # Ache cada linha que contém o texto 'class="value"', e passe para...
  # use uma expressão regular para achar o conteúdo entre ">" e "<" e...
  # salve cada linha como um item de um vetor $data
  data=($(curl -s $URL$TICKER | grep 'class="value"' | sed -En 's/[^>]*>([^<]*).*$/\1/p'))

  # Imprima na tela os dados que queremos desse ticker
  printf "%10s\t%10s\t%20s\t%20s" ${TICKER} ${data[5]} ${data[8]} ${data[11]}
  echo
done
exit 0

Eu aposto que existem jeitos melhores de imprimir bonito esses dados, na verdade devem existem maneiras muito melhores de fazer um monte de coisa. Aquele grep | sed me parece muito estranho, maaaaas...

O SCRIPT CUMPRIU O PROPÓSITO!

Depois ele acabou perguntando se dava para "rodar" o script dentro de uma planilha do google, e eu escrevi um código equivalente no gscript, mas isso fica para um post futuro.

Espero que tenha gostado, continue programando!

marcel0ll


Tem dúvida? Quer só bater um papo? Me manda uma mensagem ou marque @marcel0ll no twitter!