En la Pandemia, descubrí la página de Dades Obertes de la GVA, donde aplicando la técnica de Scraping y R podía generar gráficas de los Datos Históricos del Covid por municipios.
Desde entonces, estoy haciendo varios proyectos de Scraping para uso personal, entre ellos, este de la Bolsa de Instituciones Sanitarias de la GVA. Me di cuenta que la consulta de los listados de puntos por categoría y departamento y el de situación por categoría y departamento no están cruzados, y me pareció interesante cruzarlos y tenerlos todos en una misma tabla en formato CSV para poder analizar los datos como hace la APP no oficial «Bolsa Sanidad C. Valenciana» pero en bruto.
Para ello, he compartido un Script en GitHub, donde cargando la función y llamando a la función con los parámetros correctos, nos genera un archivo llamado bolsa.csv con los datos.
Pero empecemos primero contando como analicé las búsquedas y como fui construyendo el Script.
Fase de investigación
Lo primero que observé es que en las búsquedas, hay tres campos importantes que son:
- Turno.
- Categoría.
- Departamento.
Lo primero que tenía que hacer, era generar un diccionario de estos campos, cosa que no me fue difícil accediendo en modo desarrollador en el formulario del filtro y ver los Combobox.
Turno
Este caso es muy simple, y en el Script lo preparo así:
turnos <- data.frame(
"turnoCod" = c("O","P"),
"turnoDesc" = c("ORDINARIO","PROMOCIÓN INTERNA"),
"turnoDescv" = c("ORDINARI","PROMOCIÓ INTERNA TEMPORAL")
)
Categoría
En el caso de las categorías tampoco fue difícil, y también vi que se relacionaban mediante categoriaCod formado por un código numérico de 4 cifras y categoriaDesc donde se describia en texto la categoría.
categorias <- data.frame(
"categoriaCod" = c("0001",
"0002",
.........
"categoriaDesc" = c("ENGINYER D'APLICACIONS I SISTEMES",
"ANALISTA PROGRAMADOR I DE SISTEMES",
"METGE CONDUCTES ADDICTIVES",
.....
Departamento
Pasa lo mismo que el caso anterior, y se relaciona mediante departamentoCod y departamentoDesc.
departamentos <- data.frame(
"departamentoCod" = c("ALI","ALY","ARN","CAS","CLI","DEN","ELD","ELX","GAN","GEN","LFE","MBA","ORI","PES","PLA","REQ","RIB","SA","SAG","SJO","SPA","SPC","SPV","SPY","SV","TRV","VIN","XAT"),
"departamentoDesc" = c("ALICANTE","ALCOY","ARNAU","CASTELLON","CLINICO","DENIA","ELDA","ELX","GANDIA","GENERAL","LA FE","MARINA","ORIHUELA","PESET","LA PLANA","REQUENA","RIBERA","SES ALICANTE","SAGUNTO","SAN JOAN","S. P. ALICANTE","S. P. CASTELLÓN","S. P. VALENCIA","S. P. ALCOY","SES VALENCIA","TORREVIEJA","VINAROZ","XATIVA")
)
Y con todos estos diccionarios preliminares, nos ponemos en acción.
Listado puntuación
Si entramos en modo desarrollador en el navegador y consultamos el listado de una categoría en concreto y un departamento podemos observar que se realiza una llamada a la página http://www2.san.gva.es/bolsa/lstCandidatosListaOperativa.jsp donde se le pasan los siguientes parámetros:
- codedicion: El código de la edición, que en el momento de escribir este artículo es la 19.0.5.0.
- turnoCod
- categoriaCod
- departamentoCod
- turnoDesc
- categoriaDesc
- departamentoDesc
- posicionFinal: Posición final a la hora de realizar la consulta.
- posicionInicial: Posición inicial a la hora de realizar la consulta.
- nw: este parámetro puede ser true o false. Deduzco que será el formato a mostrar si es el New o no.
Por tanto, con todos estos parámetros, tan solo hemos de construir una consulta, como por ejemplo:
http://www2.san.gva.es/bolsa/lstCandidatosListaOperativa.jsp?codedicion=19.0.5.0&turnoCod=O&categoriaCod=0011&departamentoCod=ALI&turnoDesc=ORDINARIO&categoriaDesc=AUXILIAR%ADMINISTRATIU&departamentoDesc=ALICANTE&posicionFinal=5&posicionInicial=1&nw=true
Donde obtenemos los 5 primeros de la lista de la Categoría Auxiliar Administrativo de Alicante:

Lista de situación
Parecido a la lista anterior, deducimos que la dirección para consultar la lista de situación es: http://www2.san.gva.es/bolsa/lstSituacionCandidatos.jsp y vemos que los parámetros que requiere son:
- turnoCod
- categoriaCod
- departamentoCod
- turnoDesc
- categoriaDesc
- departamentoDesc
- posicionFinal: Posición final a la hora de realizar la consulta.
- posicionInicial: Posición inicial a la hora de realizar la consulta.
- nw: este parámetro puede ser true o false. Deduzco que será el formato a mostrar si es el New o no.
Con estos parámetros, podemos realizar la siguiente consulta, donde se nos mostraría las 5 primeras posiciones de la lista de Administrativo de La Fe
https://www2.san.gva.es/bolsa/lstSituacionCandidatos.jsp?turnoCod=O&categoriaCod=0087&departamentoCod=LFE&turnoDesc=ORDINARIO&categoriaDesc=ADMINISTRATIU&departamentoDesc=LA%FE&posicionFinal=5&posicionInicial=1&nw=true
Obteniendo el siguiente resultado:

Scraping
Mediante la función read_html del paquete rvest, paso la dirección que quiero leer y con html_nodes extraigo partes del HTML.
Podéis ver el código en mi GitHub.