Usando bash para web scraping
10/11/2020Um 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