Help com scraperwiki - Tramitação CLDF

4 views
Skip to first unread message

Ricardo Poppi

unread,
May 19, 2011, 4:45:26 PM5/19/11
to thackday, thack...@lists.riseup.net
Aê galera, nesses dias de #cici2011 animei de tentar montar um banco de dados dos PLs que estão tramitando na CLDF. A parada tá meio fácil, o link deles aceita parametro e solta uma table html. Minha dificuldade está sendo fazer o scraperwiki/beautifullsoup detectar as tables corretamente.

Vamos às infos:


2- Descrição dos parâmetros: http://www.cl.df.gov.br/Legislacao/consultaProposicao-<tipo_de_proposicao>!<numero_da_proposicao>!<ano_da_proposicao>!visualizar.action

<tipo_de_proposicao> => É um número de acordo com uma regra interna do sistema [1]
<numero_da_proposicao> => Numero do projeto mesmo
<ano_da_proposicao> => Ano da apresentação do projeto

3- Tentei montar um scraper baseado no do senado feito pelo Markun. Como já falei minha dificuldade é recuperar o dado das tables já que as divs não tem nome e a classe das tables - "tdLabel" - é sempre a mesma. Alguém tem uma dica? Esse é o meu scraper: http://scraperwiki.com/scrapers/tramitacao-cldf/

[1]
1- Projeto de Lei 
8- Projeto de Lei Complementar 
9- Proposta de Emenda à Lei Orgânica 
6- Projeto de Decreto Legislativo 
5- Projeto de Resolução 
2- Indicação 
4- Moção 
7- Recurso 
3- Requerimento 

Pedro Markun

unread,
May 19, 2011, 9:38:07 PM5/19/11
to thac...@googlegroups.com, thack...@lists.riseup.net
Poppi,

vou mandar numa outra thread uma chamada prum workshop expresso de scraperwiki... passou da hora de eu articular isso.

pontualmente, tem varias maneiras de preparar esse neston.

O BeautifulSoup pode procurar por qualquer atributo, não só por classes. Então tem algumas maneiras de fazer isso:

linhas = soup.findAll("tr") <- acha todas as linhas
for linha in linhas:
    coluna = linha.findAll("td", { "width" : "500" }) <- acha todas as colunas com width 500 (mas podia ser também a class 'linha')
    Proposicao = coluna[0].text.strip()
    Ementa = coluna[1].text.strip()

e por ai vai...

Isso só funciona se todas as páginas tiverem todas as colunas. Da pra comparar o texto do label também com:

soup.find("td", text="texto")

Pra quem não entendeu um caralho e quer entender, aguarde :P Vou montar um cursinho de scrapyourself!

abs,
Pedro Markun


2011/5/19 Ricardo Poppi <rica...@gmail.com>

--
Você está recebendo esta mensagem porque se inscreveu no grupo "Transparência Hacker" dos Grupos do Google.
Para postar neste grupo, envie um e-mail para thac...@googlegroups.com.
Para cancelar a inscrição nesse grupo, envie um e-mail para thackday+u...@googlegroups.com.
Para obter mais opções, visite esse grupo em http://groups.google.com/group/thackday?hl=pt-BR.

Luis Leao

unread,
May 19, 2011, 10:07:14 PM5/19/11
to thac...@googlegroups.com, thack...@lists.riseup.net
Dei uma alterada lá.


Consegui separar a parte do histórico também. Para manter no mesmo registro, coloquei o prefixo "historico_" seguido do número e do campo. Ainda não vi no scraperwiki como criar uma segunda tabela (dependente da principal).

Para saber quantos registros de histórico existem inseri também o campo "historicos".


Ficou bem simples o código. O site apesar de estar em html está com os campos bem formatados (espero que nas páginas seguintes esteja assim também).


Falta uma tarefa para fazer: percorrer os registros dos tipos e números de projetos e identificar quando chegou no final de projetos (deve dar um erro 404 na página).



Se precisarem de mais alguma ajuda, só falar ;)




[]'s
Luís
@luisleao
@sms2blog

(31) 9222-7897







2011/5/19 Pedro Markun <pe...@esfera.mobi>

Luis Leao

unread,
May 19, 2011, 10:11:20 PM5/19/11
to thac...@googlegroups.com, thack...@lists.riseup.net
Ah, uma dica para usar o BeautifullSoup é abrir o arquivo original e tentar encontrar algum padrão de repetição. No caso desse exemplo, haviam dois atributos "class" repetindo no html (um para o nome do dado e outro para o valor: tbLabel e linha são os parâmetros desse atributo) e esse padrão permitia separar somente os dados que precisávamos.

O código fica mais simples assim do que filtrar cada campo individualmente.


[]'s
Luís



2011/5/19 Luis Leao <luis...@gmail.com>

Ricardo Poppi

unread,
May 20, 2011, 12:47:37 AM5/20/11
to thac...@googlegroups.com, thack...@lists.riseup.net
Super! Valeu Pedro, Luis, vou dar uma estudada no código pra poder brincar em outros sites tb! Agora é bolar uma visualização/hack com essa tabela!

Abcs! Ricardo.

Ana Carolina Moreno

unread,
May 20, 2011, 3:30:11 PM5/20/11
to thack...@lists.riseup.net, thac...@googlegroups.com
Oi meninos, tudo bem?

Tenho acompanhado de longe as iniciativas de vocês pela lista (e agora pelo UOL hehehe).

Estou trabalhando na Folha Online e adoraria escrever uma matéria sobre esse banco de dados da câmara do DF, se vocês quiserem divulgar, ok?

Beijos
Carol

2011/5/20 Ricardo Poppi <rica...@gmail.com>

Luis Leao

unread,
May 20, 2011, 3:38:06 PM5/20/11
to thac...@googlegroups.com, thack...@lists.riseup.net
Fiz mais um ajuste lá.

Fica pendente só salvar onde parou em cada tipo de projeto (para pegar novos dados ou continuar no caso de erro).

Tem uma questão que vale a pena ver é que o histórico deve mudar, portanto o sistema deve "zerar" essa posição em algum momento. Deixei o scraperwiki rodando e ele pegou até 99 (de cada tipo). Pelo jeito não deve dar mais o erro de limite de tempo da CPU (ou aumentaram o recurso).


Dá para melhorar ainda mais o código, mas foi até onde consegui ir.


[]'s
Luís




2011/5/20 Ricardo Poppi <rica...@gmail.com>

Ricardo Poppi

unread,
May 20, 2011, 4:44:09 PM5/20/11
to thac...@googlegroups.com, thack...@lists.riseup.net
Massa demais Luis, vou brincar com ele, já pude ler o scrap inteiro e entendi legal o código, acho que vou poder aproveitar para outros scraps tb. Super valeu o apoio brother.

Abcs! Ricardo. 
Reply all
Reply to author
Forward
0 new messages