Primeira frustração do ano - Scraping de dados de convênio

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 () {
   document.forms[getNetuiTagName("form",this)][getNetuiTagName("actionJSP",this)].value = 'acObterListaPrestadorServico';
   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):

  portlet_27_1{pageFlow.actionJSP}: acObterListaPrestadorServico
  portlet_27_1{pageFlow.consultaPrestadorServicoFormBean.prestadorselecionado}:
  portlet_27_1{pageFlow.consultaPrestadorServicoFormBean.nmFiltro}:
  portlet_27_1wlw-select_key: {pageFlow.consultaPrestadorServicoFormBean.especialidadeVOFiltro.cd_Especialidade}OldValue: true
  portlet_27_1wlw-select_key: {pageFlow.consultaPrestadorServicoFormBean.especialidadeVOFiltro.cd_Especialidade}: -1
  portlet_27_1wlw-select_key: {pageFlow.consultaPrestadorServicoFormBean.especialidadeVOFiltro.cd_cidade}OldValue: true
  portlet_27_1wlw-select_key: {pageFlow.consultaPrestadorServicoFormBean.especialidadeVOFiltro.cd_cidade}: 4106902
  portlet_27_1wlw-select_key: {pageFlow.consultaPrestadorServicoFormBean.bairroSelecionado}OldValue: true
  portlet_27_1wlw-select_key: {pageFlow.consultaPrestadorServicoFormBean.bairroSelecionado}: 0
  
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&_windowLabel=portlet_27_1&_pageLabel=pam_redecredenciada_intranet&wsrp-urlType=blockingAction&wsrp-url=&wsrp-requiresRewrite=&wsrp-navigationalState=&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&wsrp-mode=&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&wsrp-mode=&wsrp-windowState=? É "só" trocar aquele zero antes do &...

Por enquanto larguei mão de fazer o crawler.

2014 - Final de ano

Passei o resto do ano sem muito assunto p/ ter o que escrever aqui. Pelo menos algo que possa ser interessante p/ alguém.
Uma das partes boas do ano é que conheci e consegui manter algum contato com pessoas da área. Sendo mais específica, com o Júlio de Lima, após um curso que ele ministrou no SEBRAE. Isso p/ mim é um puta avanço porque, por exemplo, na Python Brasil em Curitiba passei pelo evento como se fosse transparente (mesmo conhecendo o Ramiro).

Falando no Júlio, rolou um desafio #agiletesters e me deram o tema "Automatizando os testes com Model-Based testing". Escrevi no Google docs: deu 16 páginas e tem imagens. O link é esse: Desafio agiletesters - automatizando testes com model based testing
São 16 páginas porque eu me controlei e não escrevi sobre utillização de cadeias de Markov p/ testar software -- eu acho anormal esse interesse todo, mas os culpados são o professor Sebastian Thrun e as aulas de Inteligência Artificial.

Também voltei a desenhar, dessa vez usando materiais "corretos": lápis mais macio, esfuminhos (parei de engordurar papel esfregando os dedos), papel com gramatura mais alta... E, dado que virei Whovian, o primeiro "modelo" escolhido foi Matt Smith: [Desenho] Matt Smith - Doctor Who

Fui nos meus primeiros encontros Whovian, sendo um deles um piquenique. A gincana foi um fiasco porque como não assisti ainda à série antiga, não tinha a menor ideia de como eram os personagens.

Terei onde gastar meu dinheiro em busca de materiais p/ desenho porque aqui perto de casa abriu uma Livraria Cultura e eles tem papel Canson, MiTeintes e Renaud, esfuminhos e pastéis (oleosos e secos). Uma palavra: meus sábados serão melhores devido ao possível trajeto aula de violino -> livraria.

E tive a confirmação, ao assistir Frozen, de que gosto de personagens "retardados", tipo o Olaf:

Ri à beça de uma parte ínfima do nerdplayer 150 (tempo: 5:50) : https://www.youtube.com/watch?v=uoFS4sZveks

Continuo odiando os controles do WoW. E a repetição de Diablo 3.