Leitura automática de páginas com envio de informações

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.

Compartilhe o link desse texto, mas se for copiar algum trecho, cite a fonte. Valorize nosso trabalho.
Mais informações na licença de uso do site.