Este scrapper se encarga de ingresar a los sitios oficiales de Diputados y Senadores de Argentina y descargar el listado de votaciones por año, sus detalles, así como de enviar esa información en crudo al API encargado de normalizar y guardar esa información en una base de datos.
En el siguiente apartado se explican los métodos existentes para descargar contenido. Los proveedores disponibles al día de hoy son "diputados" y "senadores".
IMPORTANTE
Este proyecto se desarrolló bajo Node 11.14.0 o superior. No se asegura el correcto funcionamiento para versiones anteriores.
Si tenés otra versión de Node y no podés reemplazarla por ésta, te recomiendo utilizar un gestor de versiones como NVM. De este modo, podrás cambiar entre versiones sin problemas, ejecutando simplemente
nvm usedesde la raíz del proyecto.Esto es posible por la existencia del archivo
.nvmrcque le indica a NVM qué versión utilizar en este contexto.
npm start votaciones <proveedor> <año>Descarga el listado de votaciones del año indicado para el proveedor; y genera un archivo en la ruta ./datos/<proveedor>/<año>.json.
Ejemplo de contenido de un archivo generado con este método:
[
//...
{
id: "3617",
date: "788072220",
title:
"Modificación al Régimen Electoral Nacional, elección de Presidente y Vicepresidente de la Nación, Senadores y Diputados Nacionales - En General",
type: "Votación Nominal",
result: "AFIRMATIVO",
url: "/votacion/3617",
records: [
{
id: "158-S-1994",
title:
"Modificación al Régimen Electoral Nacional, elección de Presidente y Vicepresidente de la Nación, Senadores y Diputados Nacionales - En General "
}
]
}
//...
];npm start votos <diputados> <año>A partir del archivo descargado con el método anterior, generado en ./datos/diputados/<año>.json, ingresa a la página
individual de cada una de esas votaciones y toma los detalles particulares de las mismas, así como también descarga el archivo CSV con los votos nominales en la ruta ./datos/diputados/votos/<id>/<archivo>.csv.
Al finalizar el proceso, reemplazar el archivo original con todos los nuevos datos.
Siguiendo el ejemplo anterior, la votación descargada del listado, ahora tendrá la siguiente estructura:
[
//...
{
id: "3617",
date: "788072220",
title:
"Modificación al Régimen Electoral Nacional, elección de Presidente y Vicepresidente de la Nación, Senadores y Diputados Nacionales - En General",
type: "Votación Nominal",
result: "AFIRMATIVO",
url: "/votacion/3617",
records: [
{
id: "158-S-1994",
title:
"Modificación al Régimen Electoral Nacional, elección de Presidente y Vicepresidente de la Nación, Senadores y Diputados Nacionales - En General "
}
],
period: 112,
meeting: 43,
record: 2,
president: "ROMERO, Carlos Alberto",
documentUrl:
"https://votaciones.hcdn.gob.ar/proxy/pdf/1994/112PO03_02_R43.pdf",
affirmativeCount: "139",
negativeCount: "0",
abstentionCount: "0",
absentCount: "117"
}
//...
];npm start importar <proveedor> <año> [soloEstasVotaciones..]Este método envía en varias peticiones POST la información generada para cada votación del año indicado. Como contrapartida, el API al que se envíe esta información debe contener tres endpoints preparados para recibir toda esta data. Los mismos deberían ser:
- POST
votingsCreación de la votación - POST
votings/<id>/recordsCreación de los expedientes de la votación - POST
votings/<id>/votesCreación de los votos nominales de la votación
Se puede indicar que sólo se envíe la información de determinadas votaciones a través del argumento opcional [soloEstasVotaciones..].
Por ejemplo: npm start importar 1994 3617 3618 3619 sólo enviará las votaciones de 1994
con ID 3617, 3618 y 3619.
Para ver cómo se inicia el navegador y el bot realiza acción por acción, podés ejecutar el comando en modo de desarrollo
reemplazando npm start por npm run watch al inicio de cada método.
Si te interesa debuggear o desarrollar otros métodos para scrappear contenido, recomiendo utilizar el comando
npm run dev en vez de npm start.
Este comando, requiere que tengas el IDE configurado con auto-attach para Node. Si utilizás VSCode, este proyecto lo tiene activado por defecto.
Más información: https://code.visualstudio.com/blogs/2018/07/12/introducing-logpoints-and-auto-attach
- Typescript. En especial para definir interfaces que permitan escalar a otros proveedores de una forma estandarizada.
- Desacoplar y simplificar:
- Extraer la lógica del scrapper del proveedor
- Proveedores sólo con funciones puras.
- Integrar tests
- Logger
Si te interesa colaborar, contactate conmigo a través de mi cuenta en Twitter.
Segui mi actividad en:
- Medium: @nahuelhds
- Twitter: @nahuelhds
Si te gusta lo que hago y querés darme una mano:
- Podés invitarme un café en Ko-Fi
- O también dándome apoyo en Patreon