4 个版本
0.1.3 | 2022年3月25日 |
---|---|
0.1.2 | 2021年12月1日 |
0.1.1 | 2021年12月1日 |
0.1.0 | 2021年12月1日 |
#4 in #la
120KB
1.5K SLoC
用于消费墨西哥失踪人口公共数据的Crate
所有函数的文档可以在 这里 找到。如果在阅读了本介绍和示例后还有任何疑问,请在 Twitter 上给我发消息 @moaimx
该Crate包含用于消费Versión Pública RNPDNO数据的函数。
墨西哥失踪人口的资料是公开的,但消费这些资料的唯一方法是通过一个可以设置筛选器并获得满足筛选器条件的数据库值的网站。此外,该网站没有数据访问权限,仅执行一些基于获取数据的图表。这使得获取信息的过程变得重复且复杂,并且该网站受到 Captcha 保护,使得向数据库发起请求数据的过程更加缓慢。
使用此Crate可以系统地消费数据库数据,而不必经过网站和Captcha。
基本操作
此Crate在高级函数中编码了4个操作
- 通过“get_diccionarios()”函数生成字典
- 通过“extraer()”函数编码结构化参数的通用数据请求
- 通过“extraer_por_...”高级函数迭代感兴趣的变量
- 通过“extraer_todo_iterando()”函数提取所有数据,迭代所有可能的筛选器变量和它们的值
数据部分
'extractor'模块提供高级函数,以执行对数据库的通用请求,这些请求可以根据API的参数结构进行筛选。
所有高级函数提供的请求都通过一次执行返回不同聚合级别的数据。
输出文件中的聚合级别与RNPDNO图表中的级别相对应。除了总计部分外,所有数据都按性别分解。
- 总计部分:包含不同失踪状态的数据,以百分比和绝对数值表示。
- 空间部分:包含按空间单位分解的数据,空间聚合单位取决于过滤器中选定的级别。因此,如果过滤器指示国家搜索,则分解对应州,如果过滤器指示州级搜索,则分解为市级,如果过滤器指示市级搜索,则分解到街区级别。
- 年度部分:包含按失踪年份分解的数据。
- 上一年度月度部分:包含过去十二个月按失踪月份分解的数据。
- 年龄部分:包含按失踪者年龄分解的数据。
- 国籍部分:包含按失踪者国籍分解的数据。
- 参数部分:包含用于进行搜索的过滤器的值摘要。
基本请求流程
字典应只生成一次并保存。此crate存储库包含字典,以防您不想运行函数。
其余操作的流程相同
- 确定写入文件的路径
- 创建一个用于请求的参数结构
- 修改参数以创建所需的过滤器
- 执行请求
请求示例
要执行以下示例,需要在您的机器上安装Rust,按照以下说明进行。
安装Rust后,有两种使用此crate的方式。
第一种是下载此存储库。下载后,您需要进入包含所有文件的目录,在代码编辑器(如VSCode)中打开src目录中的main.rs文件。打开后,您将注意到其中包含第一个示例的代码。要执行它,您需要在终端进入项目目录,编译并使用"cargo run --release"指令执行文件。键入此指令并按回车键将执行示例。执行后,您将看到从RNPDNO平台下载的数据文件。
要尝试更复杂的示例,您需要将main.rs文件的内容更改为新示例或您自己的代码。
第二种方式是将此crate作为Rust存储库中的crate使用。这样,您不需要从存储库下载任何内容。为此,您需要使用cargo创建一个新的项目。在终端中,在您想创建它的目录中,执行"cargo new nombre_del_proyecto"指令(用您想要的名称替换nombre_del_proyecto)。然后,您需要进入新创建的cargo目录。您可以使用"cd nombre_del_proyecto"来完成此操作。
一旦您进入项目目录,您需要打开Cargo.toml文件,并在"dependencies"部分添加以下行
reqrnpdno = "0.1"
只需将其放在下面即可。您的文件应类似于以下内容
[package]
name = "nombre_del_proyecto"
version = "0.1.0"
edition = "2018"
[dependencies]
reqrnpdno = "0.1"
现在,在main.src文件中,您需要将内容替换为第一个示例的内容。要执行它,您需要在终端进入项目目录,编译并使用"cargo run --release"指令执行文件。键入此指令并按回车键将执行示例。执行后,您将看到从RNPDNO平台下载的数据文件。
要尝试更复杂的示例,您需要将main.rs文件的内容更改为新示例或您自己的代码。
简单请求示例
以下示例显示了如何执行简单请求。
use reqrnpdno::{extractora,parameters::Parametros};
fn main () {
// Aquí se define la ruta en donde se guardarán los datos. En este caso es un archivo de tipo JSON llamado datos.json
let rutam = "./datos.json".to_string();
// Aquí creamos la estructura de los parámetros necesarios para realizar la petición.
// Esta estructura es la que se necesita modificar si quieres aplicar algún filtro.
// Si no quieres filtrar no es necesario modificar la estructura.
let mut parametros = Parametros::new();
// Aquí se modifican los valores de los parámetros para aplicar algunos filtros.
// En este caso se coloca el valor "7" en el campo "id_estatus_victima" el cual corresponde a "PERSONAS DESAPARECIDAS Y NO LOCALIZADAS".
// También cambiamos el parámetro "titulo" y colocamos el título.
// Además usamos los parámetros "fecha_inicio" y "fecha_fin" para limitar la búsqueda a un rango de fechas.
parametros.id_estatus_victima = "7".to_string();
parametros.titulo = "PERSONAS DESAPARECIDAS Y NO LOCALIZADAS".to_string();
parametros.fecha_inicio = "2000-01-01".to_string();
parametros.fecha_fin = "2021-08-20".to_string();
// Por último, utilizamos la función de alto nivel "extraer" para obtener nuestros datos.
extractora::extraer(¶metros, &rutam).unwrap();
}
字典创建示例
以下示例展示了如何创建字典。要执行此示例,您需要修改src文件夹中的main.rs文件,并添加以下内容:
use reqrnpdno::extractora;
fn main () {
// Definimos la ruta donde se escribirán los diccionarios, en este caso la ruta es un directorio.
let ruta_salida = "./".to_string();
// Obtener los diccionarios
extractora::get_diccionarios(&ruta_salida).unwrap();
}
迭代变量的请求示例
有时我们希望按RNPDNO平台上的某些可以筛选的变量对数据进行拆分。也就是说,我们希望迭代一个变量的所有可能值。此crate包含用于执行这些迭代请求的高层函数,而无需编写循环。在这个例子中,我们想要迭代“circunstancias”变量,因此我们将使用“extraer_por_circunstancias()”函数。这些迭代函数的输出是每个变量值的单独文件,因此路径需要是目录。要执行此示例,您需要修改src文件夹中的main.rs文件,并添加以下内容:
use reqrnpdno::{extractora,parameters::Parametros};
fn main () {
// Aquí se define la ruta en donde se guardarán los datos. En este caso es el directorio salida.
// Puedes cambiar el nombre pero tiene que ser un directorio que exista.
let ruta_salida = "./salida/".to_string();
// Aquí creamos la estructura de los parámetros necesarios para realizar la petición.
// Esta estructura es la que se necesita modificar si quieres aplicar algún filtro.
// Si no quieres filtrar no es necesario modificar la estructura.
let mut parametros = Parametros::new();
// Aquí se modifican los valores de los parámetros para aplicar algunos filtros.
// En este caso se coloca el valor "7" en el campo "id_estatus_victima" el cual corresponde a "PERSONAS DESAPARECIDAS Y NO LOCALIZADAS".
// También cambiamos el parámetro "titulo" y colocamos el título.
parametros.id_estatus_victima = "7".to_string();
parametros.titulo = "PERSONAS DESAPARECIDAS Y NO LOCALIZADAS".to_string();
// Por último, utilizamos la función de alto nivel "extraer_por_circunstancias" para obtener nuestros datos.
// La salida será una serie de archivos JSON, uno por cada opción en la variable a iterar, en este caso es la variable circunstancias
extractora::extraer_por_circunstancias(¶metros, &ruta_salida).unwrap();
}
迭代所有变量的请求示例
最后,我们将展示一个高级函数的使用,它允许我们获取尽可能多的数据。然而,在您执行此函数之前,重要的是要知道该函数会执行大量请求,因此它将花费很长时间才能完全执行。**请不要仅为了测试而使用此函数,请仅在您想要所有生成数据时使用它**。该函数迭代RNPDNO平台上可以筛选的所有变量的所有可能值。此函数的输出是一个包含数据的目录结构,因此路径需要是目录。在这个例子中,还展示了如何使用一个辅助函数来创建下载所有数据的目录。要执行此示例,您需要修改src文件夹中的main.rs文件,并添加以下内容:
use reqrnpdno::{extractora,parameters::Parametros,utilidades};
fn main () {
// Aquí se define la ruta en donde se guardarán los datos.
// En este caso es un directorio llamado "30-nov-2021" que aún no existe pero que crearemos en el directorio "salida".
// Para crearlo usamos la función de ayuda "crear_directorio()" para la cual el primer parámetro es la ruta objetivo y el segundo parámetro es el nombre del directorio a crear.
let ruta_salida = utilidades::crear_directorio("./salida/", "30-nov-2021").unwrap();
// Aquí creamos la estructura de los parámetros necesarios para realizar la petición.
// Esta estructura es la que se necesita modificar si quieres aplicar algún filtro.
// Si no quieres filtrar no es necesario modificar la estructura.
let parametros = Parametros::new();
// Para este caso no modificaremos la estructura con los parametros.
// Por último, utilizamos la función de alto nivel "extraer_todo_iterando" para obtener nuestros datos.
extractora::extraer_todo_iterando(¶metros, &ruta_salida).unwrap();
}
依赖项
~7-20MB
~323K SLoC