Suponha que você precisa consultar algumas informações disponíveis em um site para um determinado dia, mês e ano. Existem interfaces HTML com seletores de menus que facilitam a busca – basta selecionar as opções e clicar em “busca” – os parâmetros preenchidos são enviados como um formulário HTML através dos métodos GET ou POST para retornarem o resultado da busca em outra página. Mas e se forem várias datas, por exemplo? Seria muito trabalhoso e demorado fazer “na mão”. Alguns sites e sistemas não disponibilizam a informação da maneira mais adequada para esse propósito. Seguem duas opções para entrar automaticamente os valores nos menus para cada caso em um loop.
A primeira opção seria construir um for para cada opção (ou seja, cada “name” dos ‘select’s no código HTML) em shell script e utilizar o comando cURL:
curl --data "cmbDia=$dia&cmbMes=$mes&cmbAno=$ano" http://www.site.com.br/path/file.html
Nesse caso, os campos a serem preenchidos são ‘cmbDia’, ‘cmbMes’ e ‘cmbAno’, com valores dados pelas variáveis previamente definidas.
Outra opção é usar o script em python a seguir, com os loops já construídos e módulos importados. Ele é baseado nas funções da biblioteca urllib: urlencode (gravar os parâmetros a serem enviados via get/post através de seus nomes de identificação) e urlopen (abre o link enviando os parâmetros).
#!/usr/bin/python # -*- coding: utf-8 -*- import urllib from bs4 import BeautifulSoup from datetime import date, timedelta import sys reload(sys) sys.setdefaultencoding("utf-8") url = 'http://www.site.com.br/path/file.html' meses = ['jan','fev', 'mar', 'abr', 'mai', 'jun', 'jul', 'ago', 'set', 'out', 'nov', 'dez'] for ano in range(2003,2016): for mes in meses: for dia in range(1,32): print ano,'-',mes,'-',dia # Pegar todos os names dos selects params = urllib.urlencode({'cmbDia': dia, 'cmbMes': mes, 'cmbAno': ano}) f = urllib.urlopen(url, params) html = BeautifulSoup(f) td = html.find_all('td') i = 2 dados = {} while(i != len(td)): print td[i] # Pegar linha com palavra "word" de interesse self.request.get_all('word') i += 1
No post sobre Python, existe um script com mais opções, no caso de uma lista que só aparece após ser escolhida uma opção de um menu anterior.
Existem sites que incorporam chaves inseridas via “input type=’hidden'” ou através de variáveis “session”, então elas não receberão os parâmetros – aí precisa incluir alguns truques, mas por enquanto é isso.
Outra aplicação do BeautifulSoup para extrair dados de uma tabela HTML pode ser vista no post Baixando dados de tabelas.
A Olívia roubou pão na casa do João