Giter VIP home page Giter VIP logo

votaciones-ar-scrapper's Introduction

Scrapper de las votaciones de Argentina

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.

Documentación

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 use desde la raíz del proyecto.

Esto es posible por la existencia del archivo .nvmrc que le indica a NVM qué versión utilizar en este contexto.

Descargar listado de votaciones

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 "
      }
    ]
  }
  //...
];

Completar los detalles de cada votación descargada

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"
  }
  //...
];

Importar la información generada en el API

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 votings Creación de la votación
  • POST votings/<id>/records Creación de los expedientes de la votación
  • POST votings/<id>/votes Creació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.

¿Querés ver al bot en acción?

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.

Debugging y desarrollo

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

TODOs

  • Typescript. En especial para definir interfaces que permitan escalar a otros proveedores de una forma estandarizada.
  • Desacoplar y simplificar:
    1. Extraer la lógica del scrapper del proveedor
    2. Proveedores sólo con funciones puras.
  • Integrar tests
  • Logger

Colaboraciones

Si te interesa colaborar, contactate conmigo a través de mi cuenta en Twitter.

nahuelhds

Segui mi actividad en:

Si te gusta lo que hago y querés darme una mano:

votaciones-ar-scrapper's People

Watchers

 avatar

Forkers

lzok parisote

votaciones-ar-scrapper's Issues

Optimizaciones sobre Diputados

Separar la data de los expedientes del cuerpo de la votación.

Generar CSVs desde el proyecto tal como se hace con senadores.

Limpiar saltos de línea desde la propia lectura del scrapper.

Babel + ESLint + Prettier + Winston

Para facilitar el desarrollo, se integra Babel.
Para asegurar formato se integra ESLint + Prettier.
Para mejorar el logging, se integra Winstong

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.