marcel0llEN | PT

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 mande um e-mail: marcelo@lotuz.dev