Primeira frustração do ano - Scraping de dados de convênio
Autor: Isis Binder | Publicado: 2015-01-03T10:40:00-02:00

Esses dias minha mãe me pediu p/ imprimir todos os médicos conveniados da Itaipu, porque eles não enviam mais o livrinho impresso. P/ minha infelicidade, os dados são paginados e se você for fazer isso na mão, vai ter que ficar copiando, colando e formatando no editor de texto. Não, né....

Meu desespero começou quando vi que usam frameset na página. 1994 ligou e pediu o livrinho de HTML de volta. Também deu a entender que o negócio foi feito com Portlets. E o botão "consultar" é um link que aciona uma função javascript que, quando eu tento acessar o fonte pelo Chrome DevTools (clicando direto em cima), dá erro 404.

Tive que passar um tempo entendendo a mecânica da coisa e capturando algumas variáveis, além de verificar se elas não mudam a cada acesso à página. A função que realiza a consulta é essa:

function acObterListaPrestadorServico () {
&nbsp; &nbsp;document.forms[getNetuiTagName("form",this)][getNetuiTagName("actionJSP",this)].value = 'acObterListaPrestadorServico';
&nbsp; &nbsp;document.forms[getNetuiTagName("form",this)].submit();
}

Os retornos de getNetuiTagName são, respectivamente, "portlet_27_1form" e "rtlet_27_1{pageFlow.actionJSP}". Não dá certo definir os parâmetros na querystring e o Scrapy puro (normalmente minha primeira escolha p/ web scraping) não tem acesso ao objeto javascript p/ poder definir as propriedades da mesma forma que a função acObterListaPrestadorServico. Hora de mudar de abordagem e correr pro CasperJS, apesar de nunca ter feito mais que um tutorial simples.

O form data necessário é esse (em negrito estão os dados que me interessam -- especialidade e cidade):

&nbsp; portlet_27_1{pageFlow.actionJSP}: acObterListaPrestadorServico
&nbsp; portlet_27_1{pageFlow.consultaPrestadorServicoFormBean.prestadorselecionado}:
&nbsp; portlet_27_1{pageFlow.consultaPrestadorServicoFormBean.nmFiltro}:
&nbsp; portlet_27_1wlw-select_key: {pageFlow.consultaPrestadorServicoFormBean.especialidadeVOFiltro.cd_Especialidade}OldValue: true
&nbsp;&nbsp;portlet_27_1wlw-select_key: {pageFlow.consultaPrestadorServicoFormBean.especialidadeVOFiltro.cd_Especialidade}: -1
&nbsp;&nbsp;portlet_27_1wlw-select_key: {pageFlow.consultaPrestadorServicoFormBean.especialidadeVOFiltro.cd_cidade}OldValue: true
&nbsp;&nbsp;portlet_27_1wlw-select_key: {pageFlow.consultaPrestadorServicoFormBean.especialidadeVOFiltro.cd_cidade}: 4106902
&nbsp;&nbsp;portlet_27_1wlw-select_key: {pageFlow.consultaPrestadorServicoFormBean.bairroSelecionado}OldValue: true
&nbsp;&nbsp;portlet_27_1wlw-select_key: {pageFlow.consultaPrestadorServicoFormBean.bairroSelecionado}: 0
&nbsp;&nbsp;
Após instalar o CasperJS, fui trabalhando aos poucos no script p/, pelo menos, conseguir acessar o site, preencher os campos e clicar no botão (que na verdade é um link). Honestamente, achei muito confuso devido à impossibilidade de trabalhar com o DOM diretamente porque as funções não retornam nodelists (não consegui pegar os dados que eu queria). Além disso, quando resolvi dar uma olhada na paginação me deparei com uma tripa dessa:

https://www.itaipu.gov.br/PAMInternetWeb/redecredenciada.portal?_nfpb=true&amp;_windowLabel=portlet_27_1&amp;_pageLabel=pam_redecredenciada_intranet&amp;wsrp-urlType=blockingAction&amp;wsrp-url=&amp;wsrp-requiresRewrite=&amp;wsrp-navigationalState=&amp;wsrp-interactionState=_action%3D%2Fitaipu%2Fda%2Fpamho%2FprestadorServico%2FconsultaPrestador%2Fconsultar%2FacPaginacaoListaPrestadorServico%2526portlet_27_1wlw-select_key%253A%257BpageFlow.consultaPrestadorServicoFormBean.bairroSelecionado%257DOldValue%3Dtrue%2526portlet_27_1wlw-select_key%253A%257BpageFlow.consultaPrestadorServicoFormBean.especialidadeVOFiltro.cd_Especialidade%257D%3D-42%2526portlet_27_1wlw-select_key%253A%257BpageFlow.consultaPrestadorServicoFormBean.cidadeVOFiltro.cd_cidade%257D%3D4106902%2526portlet_27_1wlw-select_key%253A%257BpageFlow.consultaPrestadorServicoFormBean.especialidadeVOFiltro.cd_Especialidade%257DOldValue%3Dtrue%2526portlet_27_1wlw-select_key%253A%257BpageFlow.consultaPrestadorServicoFormBean.bairroSelecionado%257D%3D0%2526portlet_27_1wlw-select_key%253A%257BpageFlow.consultaPrestadorServicoFormBean.cidadeVOFiltro.cd_cidade%257DOldValue%3Dtrue%2526portlet_27_1_autoscope__currPage%3DgridListaPrestadorServico%257E0&amp;wsrp-mode=&amp;wsrp-windowState=

Eu tenho que falar isso: puta merda, gente! P/ quê URL limpa... Ah, sim... Eu tive um primeiro palpite "de sorte" (na realidade, por observar algo fora do padrão) p/ saber como se muda a página no meio dessa zona. Estão vendo o pedaço final, E0&amp;wsrp-mode=&amp;wsrp-windowState=? É "só" trocar aquele zero antes do &amp;...

Por enquanto larguei mão de fazer o crawler.