"Incursões violinísticas" - Mark O'Connor


Não lembro se foi em 2013, mas depois de uns 10 anos parada devido à faculdade, voltei a fazer aulas de violino. Para tentar minimizar o problema do som ruim característico de iniciantes comprei um violino elétrico. Assim posso fazer a desgraça que for: quem estiver em redor vai ouvir um som muito baixo (e os vizinhos provavelmente são poupados até disso).

Sim. Comprei um Stagg. Porque não tinha o Yamaha que eu queria.

Me intimaram a escolher uma música p/ tocar no final do ano. Essas coisas de escola de música. Se eu não achasse algo, provavelmente teria que tocar uma música do método. Reação:


Então rodei as interwebs p/ achar uma música que eu topasse tocar e não me cansasse caso eu tivesse que estudar a peça inteira desde já. Fiz um reality check, botei os pés no chão e descartei todas as minhas peças favoritas por não ter (ainda) condições de tocar aceitavelmente bem, muito menos uma orquestra à disposição: 

  • Quarteto de Cordas #19/ K.465 (Mozart);
  • Concerto #2 em G menor Opus 8/RV 315 (também conhecido como "Verão", das "Quatro Estações" de Vivaldi);
  • Erbarme Dich ("Paixão segundo São Mateus", Bach);
  • Sonata p/ violino #5 em F maior opus 24 (Beethoven);
  • Night on the bald mountain (Mussorgski);
  • Dança húngara #5 (Brahms);
  • Dante's symphony S.109 (Liszt)

Então lembrei que o Mark O'Connor pôs um arranjo de Appalachia Waltz no livro 1 do método dele. Fui atrás. Comprei a partitura no site oficial sem saber o que esperar. Quando imprimi e parei p/ ler pensei o seguinte:

  1. "Eu não lembrava que era assim" -- óbvio. O arranjo p/ dois violinos vai ser diferente da música gravada em estúdio com um violoncelo e um contra-baixo.
  2. "Cordas duplas. Legal."
  3. "Eu tenho dedos suficientes p/ tocar esse negócio?"
 Cordas duplas. Não me interessa quem compôs, qual é o gênero (já ouvi falarem que é bluegrass), estrutura, tonalidade...Ao diabo. Tem cordas duplas e soa muito bem. É uma pena que meu violino é de estudante.
Minha segunda escolha seria uma música do Carlos Nuñes (Marcha do Entrelazado de Allariz): https://www.youtube.com/watch?v=UTWEdHYQh-s

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.