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.

Outra aplicação do BeautifulSoup para extrair dados de uma tabela HTML pode ser vista no post Baixando dados de tabelas.

2 comments

Leave a Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.