# ceepur-scraper
Un programa para extraer todos los datos públicos del registro electoral de Puerto Rico, accesibles a través de [https://consulta.ceepur.org/](https://consulta.ceepur.org/).
El programa toma alrededor de 5 horas para bajar todos los datos posibles.
```bash
pip install ceepur-scraper
```
## Uso
Para correr el scraper, simplemente ejecute lo siguiente en tu terminal luego de instalar el paquete:
```bash
ceepur-scraper
```
Utiliza la opción `--help` para ver todas las opciones disponibles:
```bash
$ ceepur-scraper --help
usage: ceepur-scraper [-h] [--output OUTPUT_FILENAME] [--max-id MAX_ID] [--min-id MIN_ID]
[--reverse] [--max-concurrent-tasks MAX_CONCURRENT_TASKS]
[--continue-previous-scrape] [--save-descriptions] [--debug]
optional arguments:
-h, --help show this help message and exit
--output OUTPUT_FILENAME, -o OUTPUT_FILENAME
The filename to write the scraped voter records to. Defaults to
voter_records.csv.
--max-id MAX_ID The maximum voter ID to scrape. Cannot be greater than 9,999,999.
--min-id MIN_ID The minimum voter ID to scrape. Cannot be less than 1.
--reverse Whether to scrape in reverse order.
--max-concurrent-tasks MAX_CONCURRENT_TASKS
The maximum number of concurrent tasks to run. Defaults to 500.
--continue-previous-scrape, -c
Whether to continue a previous scrape that was interrupted.
--save-descriptions Whether to save the descriptions of the voter's status and category. ⚠️
WARNING: This will significantly increase the size of the output file.
--debug, -d Run in debug mode.
```
Esto producirá un archivo llamado `voter_records.csv` en el directorio actual que se parecerá a esta tabla:
| `NumeroElectoral` | `Category` | `FechaNacimiento` | `Precinto` | `Status` | `Unidad` |
| ----------------- | ---------- | ----------------- | ---------- | -------- | -------- |
| `4980113` | `M` | `22-10-1926` | `1` | `E` | `2` |
### Descripción de `Category` y `Status`
El campo `Category` es un solo carácter. Su significado depende del valor de `Status`.
Expanda la siguiente sección para ver el significado de cada categoría:
<details>
<summary>Haz click para expandir...</summary>
El `Status` de un elector puede ser:
* `A`: Activo
* `I`: Inactivo
* `E`: Excluido
El campo `Category` da más información acerca del `Status` de un elector:
* Para electores con status `A`, el campo `Category` puede ser:
* `1`: `VOTÓ EN NOVIEMBRE DE 2020`
* `2`: `NO VOTÓ EN NOVIEMBRE DE 2020`
* `3`: `INGRESÓ POR MEDIO DE NUEVA INSCRIPCIÓN`
* `4`: `INGRESO POR MEDIO DE INSCRIPCIÓN ESPECIAL (Reactivación)`
* `5`: `INGRESO POR MEDIO DE INCLUSIÓN (Administrativa)`
* Para electores con status `I`, el campo `Category` puede ser:
* `1`: `INACTIVO EN LA DEPURACIÓN DE LISTAS POSTERIOR A LAS ELECCIONES GENERALES DE 1980`
* `2`: `INACTIVO EN LA DEPURACIÓN DE LISTAS POSTERIOR A LAS ELECCIONES GENERALES DE 1984`
* `3`: `INACTIVO EN LA DEPURACIÓN DE LISTAS POSTERIOR A LAS ELECCIONES GENERALES DE 1988`
* `4`: `INACTIVO EN LA DEPURACIÓN DE LISTAS POSTERIOR A LAS ELECCIONES GENERALES DE 1992`
* `5`: `INACTIVO EN LA DEPURACIÓN DE LISTAS POSTERIOR A LAS ELECCIONES GENERALES DE 1996`
* `6`: `INACTIVO EN LA DEPURACIÓN DE LISTAS POSTERIOR A LAS ELECCIONES GENERALES 2000`
* `7`: `INACTIVO EN LA DEPURACIÓN DE LISTAS POSTERIOR A LAS ELECCIONES GENERALES 2004`
* `8`: `INACTIVO EN LA DEPURACIÓN DE LISTAS POSTERIOR A LAS ELECCIONES GENERALES 2008`
* `9`: `INACTIVO EN LA DEPURACIÓN DE LISTAS POSTERIOR A LAS ELECCIONES GENERALES 2012`
* `A`: `INACTIVO EN LA DEPURACIÓN DE LISTAS POSTERIOR A LAS ELECCIONES GENERALES 2020`
* Para electores con status `E`, el campo `Category` puede ser:
* `A`: `EXCLUSIÓN ADMINISTRATIVA`
* `C`: `NO ES CIUDADANO AMERICANO`
* `D`: `DUPLICADO`
* `E`: `NO TIENE 18 AÑOS DE EDAD`
* `M`: `MUERTE`
* `P`: `NO ES PERSONA EN PETICIÓN`
* `R`: `NO ES RESIDENTE DEL PRECINTO`
* `T`: `INCAPACITADO MENTAL`
</details>
También puedes correr el scraper con la opción `--save-descriptions` para guardar una descripción de cada categoría en el archivo final (⚠️ ¡Esto aumentará el tamaño del archivo significativamente!).
### ¿Qué hacer si hay un error?
Puedes intentar de recorrer un "scrape" con la opción `--continue-previous-scrape` (o `-c`) para intentar continuar el scrape desde donde se quedó.
Si todavía hay fallos, usa la opción `--debug` (o `-d`) para ver el error completo. Si no sabes como resolverlo, [abre un issue](https://github.com/jicruz96/ceepur-scraper/issues/new) en este repositorio.
## Ejemplo
```bash
# Descargar electores 1-100 y guardar en "resultados.csv", incluyendo descripciones de categorías
ceepur-scraper --output resultados.csv --min-id 1 --max-id 100 --save-descriptions
```
Raw data
{
"_id": null,
"home_page": "https://github.com/jicruz96/ceepur-scraper",
"name": "ceepur-scraper",
"maintainer": null,
"docs_url": null,
"requires_python": "<4.0,>=3.9",
"maintainer_email": null,
"keywords": "puerto-rico, electoral, scraper, ceepur",
"author": "J.I. Cruz",
"author_email": "ji@jicruz.com",
"download_url": "https://files.pythonhosted.org/packages/91/44/2a734d425a1082e40e9388e600bcb67dd87d7d59f7c11b06a923c40d429c/ceepur_scraper-0.1.1.tar.gz",
"platform": null,
"description": "# ceepur-scraper\n\nUn programa para extraer todos los datos p\u00fablicos del registro electoral de Puerto Rico, accesibles a trav\u00e9s de [https://consulta.ceepur.org/](https://consulta.ceepur.org/).\n\nEl programa toma alrededor de 5 horas para bajar todos los datos posibles.\n\n```bash\npip install ceepur-scraper\n```\n\n## Uso\n\nPara correr el scraper, simplemente ejecute lo siguiente en tu terminal luego de instalar el paquete:\n\n```bash\nceepur-scraper\n```\n\nUtiliza la opci\u00f3n `--help` para ver todas las opciones disponibles:\n\n```bash\n$ ceepur-scraper --help\nusage: ceepur-scraper [-h] [--output OUTPUT_FILENAME] [--max-id MAX_ID] [--min-id MIN_ID]\n [--reverse] [--max-concurrent-tasks MAX_CONCURRENT_TASKS]\n [--continue-previous-scrape] [--save-descriptions] [--debug]\n\noptional arguments:\n -h, --help show this help message and exit\n --output OUTPUT_FILENAME, -o OUTPUT_FILENAME\n The filename to write the scraped voter records to. Defaults to\n voter_records.csv.\n --max-id MAX_ID The maximum voter ID to scrape. Cannot be greater than 9,999,999.\n --min-id MIN_ID The minimum voter ID to scrape. Cannot be less than 1.\n --reverse Whether to scrape in reverse order.\n --max-concurrent-tasks MAX_CONCURRENT_TASKS\n The maximum number of concurrent tasks to run. Defaults to 500.\n --continue-previous-scrape, -c\n Whether to continue a previous scrape that was interrupted.\n --save-descriptions Whether to save the descriptions of the voter's status and category. \u26a0\ufe0f\n WARNING: This will significantly increase the size of the output file.\n --debug, -d Run in debug mode.\n```\n\n\nEsto producir\u00e1 un archivo llamado `voter_records.csv` en el directorio actual que se parecer\u00e1 a esta tabla:\n\n| `NumeroElectoral` | `Category` | `FechaNacimiento` | `Precinto` | `Status` | `Unidad` |\n| ----------------- | ---------- | ----------------- | ---------- | -------- | -------- |\n| `4980113` | `M` | `22-10-1926` | `1` | `E` | `2` |\n\n\n### Descripci\u00f3n de `Category` y `Status`\n\nEl campo `Category` es un solo car\u00e1cter. Su significado depende del valor de `Status`.\n\nExpanda la siguiente secci\u00f3n para ver el significado de cada categor\u00eda:\n\n<details>\n<summary>Haz click para expandir...</summary>\n\nEl `Status` de un elector puede ser:\n\n* `A`: Activo\n* `I`: Inactivo\n* `E`: Excluido\n\nEl campo `Category` da m\u00e1s informaci\u00f3n acerca del `Status` de un elector:\n\n* Para electores con status `A`, el campo `Category` puede ser:\n * `1`: `VOT\u00d3 EN NOVIEMBRE DE 2020`\n * `2`: `NO VOT\u00d3 EN NOVIEMBRE DE 2020`\n * `3`: `INGRES\u00d3 POR MEDIO DE NUEVA INSCRIPCI\u00d3N`\n * `4`: `INGRESO POR MEDIO DE INSCRIPCI\u00d3N ESPECIAL (Reactivaci\u00f3n)`\n * `5`: `INGRESO POR MEDIO DE INCLUSI\u00d3N (Administrativa)`\n* Para electores con status `I`, el campo `Category` puede ser:\n * `1`: `INACTIVO EN LA DEPURACI\u00d3N DE LISTAS POSTERIOR A LAS ELECCIONES GENERALES DE 1980`\n * `2`: `INACTIVO EN LA DEPURACI\u00d3N DE LISTAS POSTERIOR A LAS ELECCIONES GENERALES DE 1984`\n * `3`: `INACTIVO EN LA DEPURACI\u00d3N DE LISTAS POSTERIOR A LAS ELECCIONES GENERALES DE 1988`\n * `4`: `INACTIVO EN LA DEPURACI\u00d3N DE LISTAS POSTERIOR A LAS ELECCIONES GENERALES DE 1992`\n * `5`: `INACTIVO EN LA DEPURACI\u00d3N DE LISTAS POSTERIOR A LAS ELECCIONES GENERALES DE 1996`\n * `6`: `INACTIVO EN LA DEPURACI\u00d3N DE LISTAS POSTERIOR A LAS ELECCIONES GENERALES 2000`\n * `7`: `INACTIVO EN LA DEPURACI\u00d3N DE LISTAS POSTERIOR A LAS ELECCIONES GENERALES 2004`\n * `8`: `INACTIVO EN LA DEPURACI\u00d3N DE LISTAS POSTERIOR A LAS ELECCIONES GENERALES 2008`\n * `9`: `INACTIVO EN LA DEPURACI\u00d3N DE LISTAS POSTERIOR A LAS ELECCIONES GENERALES 2012`\n * `A`: `INACTIVO EN LA DEPURACI\u00d3N DE LISTAS POSTERIOR A LAS ELECCIONES GENERALES 2020`\n* Para electores con status `E`, el campo `Category` puede ser:\n * `A`: `EXCLUSI\u00d3N ADMINISTRATIVA`\n * `C`: `NO ES CIUDADANO AMERICANO`\n * `D`: `DUPLICADO`\n * `E`: `NO TIENE 18 A\u00d1OS DE EDAD`\n * `M`: `MUERTE`\n * `P`: `NO ES PERSONA EN PETICI\u00d3N`\n * `R`: `NO ES RESIDENTE DEL PRECINTO`\n * `T`: `INCAPACITADO MENTAL`\n\n</details>\n\n\nTambi\u00e9n puedes correr el scraper con la opci\u00f3n `--save-descriptions` para guardar una descripci\u00f3n de cada categor\u00eda en el archivo final (\u26a0\ufe0f \u00a1Esto aumentar\u00e1 el tama\u00f1o del archivo significativamente!).\n\n\n### \u00bfQu\u00e9 hacer si hay un error?\n\nPuedes intentar de recorrer un \"scrape\" con la opci\u00f3n `--continue-previous-scrape` (o `-c`) para intentar continuar el scrape desde donde se qued\u00f3.\n\nSi todav\u00eda hay fallos, usa la opci\u00f3n `--debug` (o `-d`) para ver el error completo. Si no sabes como resolverlo, [abre un issue](https://github.com/jicruz96/ceepur-scraper/issues/new) en este repositorio.\n\n## Ejemplo\n\n```bash\n# Descargar electores 1-100 y guardar en \"resultados.csv\", incluyendo descripciones de categor\u00edas\nceepur-scraper --output resultados.csv --min-id 1 --max-id 100 --save-descriptions\n```\n",
"bugtrack_url": null,
"license": null,
"summary": "Un programa para extraer todos los datos p\u00fablicos del registro electoral de Puerto Rico, accesibles a trav\u00e9s de https://consulta.ceepur.org/",
"version": "0.1.1",
"project_urls": {
"Homepage": "https://github.com/jicruz96/ceepur-scraper",
"Repository": "https://github.com/jicruz96/ceepur-scraper"
},
"split_keywords": [
"puerto-rico",
" electoral",
" scraper",
" ceepur"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "37034b7083cbb5a651dc473110890bf419c1c46b9cca117fb683180b96497f22",
"md5": "0c1cfb595a0371063bbb6363592542a3",
"sha256": "ea4b4fc1f06fe59d6c55b7ef7e7240258654cf334cf510e7835aad6ffb26552f"
},
"downloads": -1,
"filename": "ceepur_scraper-0.1.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "0c1cfb595a0371063bbb6363592542a3",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": "<4.0,>=3.9",
"size": 7816,
"upload_time": "2024-09-29T16:24:10",
"upload_time_iso_8601": "2024-09-29T16:24:10.436506Z",
"url": "https://files.pythonhosted.org/packages/37/03/4b7083cbb5a651dc473110890bf419c1c46b9cca117fb683180b96497f22/ceepur_scraper-0.1.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "91442a734d425a1082e40e9388e600bcb67dd87d7d59f7c11b06a923c40d429c",
"md5": "8f32bd5ecd56bacec36a70bdd5a5e67a",
"sha256": "d125950ed9282ed2a1bddf7daa20f48adbbce6a83029c5257cc3a96e213ce5dc"
},
"downloads": -1,
"filename": "ceepur_scraper-0.1.1.tar.gz",
"has_sig": false,
"md5_digest": "8f32bd5ecd56bacec36a70bdd5a5e67a",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<4.0,>=3.9",
"size": 6507,
"upload_time": "2024-09-29T16:24:11",
"upload_time_iso_8601": "2024-09-29T16:24:11.718810Z",
"url": "https://files.pythonhosted.org/packages/91/44/2a734d425a1082e40e9388e600bcb67dd87d7d59f7c11b06a923c40d429c/ceepur_scraper-0.1.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-09-29 16:24:11",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "jicruz96",
"github_project": "ceepur-scraper",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "ceepur-scraper"
}