Video sobre qué son las APIs: https://www.youtube.com/watch?v=rq6gdwEbowU
Hay organizaciones que tienen una política de datos abiertos, por lo que ofrecen un portal ad-hoc para que se pueda acceder a sus datos. La data es recogida, por lo general, en formato XML o JSON.
API significa “Aplication Programming Interface” y se puede entender como un mecanismo que nos permite interactuar con un servidor de internet. Los API permiten construir pedidos de datos a través de una dirección web. Para que el trabajo de colección de datos sea exitoso necesitamos revisar la documentación del API(https://junar.github.io/docs/es/).
Las APIs facilitan mucho la recopilación de datos al poderse acceder a ellas de forma programática ya que proveen de un proceso de acceso a ellos estandarizado: se envía una “http request” a la API y se reciben los datos en un determinado formato, generalmente JSON o XML.
Vamos a hacer un ejemplo, extrayendo datos del portal “Datos Abiertos” del Ministerio de Economía y Finanzas: https://datosabiertos.mef.gob.pe/home. Queremos extraer el dataset sobre “DETALLE DEL AÑO 2019 - Estado de situación Financiera” (https://datosabiertos.mef.gob.pe/dataviews/256688/ESTAD-DE-SITUA-FINAN-52884/):
miLLAVE="eRtYKnOjZrZnR0Y6W2Z5xwhsUZn2ODHwIQA0paxs"
Luego, te indica que construyas una solicitud para colectar los datos que están en la vista de datos actual (GUID), incluyendo el formato:
GUID="http://api.datosabiertos.mef.gob.pe/api/v2/datastreams/ESTAD-DE-SITUA-FINAN-52884/"
FORMATO='data.json/'
Entonces, tu solicitud se arma así:
request=paste0(GUID,FORMATO,'?auth_key=',miLLAVE)
#mirala
request
## [1] "http://api.datosabiertos.mef.gob.pe/api/v2/datastreams/ESTAD-DE-SITUA-FINAN-52884/data.json/?auth_key=eRtYKnOjZrZnR0Y6W2Z5xwhsUZn2ODHwIQA0paxs"
R necesita que instales jsonlite para poder interpretar formato JSON; luego de hacerlo, habilitala.De aquí, ya podrias colectar la data:
library(jsonlite)
MEFSI = fromJSON(request)
Si visualizas el objeto creado, verás que este pedido no se parece a lo que necesitas. No es que hayas fracasado, sino que debiste estudiar la documentación del API, disponible aquí(https://junar.github.io/docs/es/). Luego de leerla, sabrías que era mejor pedir otro formato para la vista de datos, el PJSON:
FORMATO='data.pjson/'
request2=paste0(GUID,FORMATO,'?auth_key=',miLLAVE)
Usemos la nueva solicitud:
MEFSI = fromJSON(request2)
Veamos su estructura:
str(MEFSI)
## List of 20
## $ result :'data.frame': 1000 obs. of 18 variables:
## ..$ NIVEL : chr [1:1000] "MINISTERIOS" "MINISTERIOS" "MINISTERIOS" "MINISTERIOS" ...
## ..$ CODI_DIS : chr [1:1000] "14" "14" "14" "14" ...
## ..$ CODI_PRO : chr [1:1000] "01" "01" "01" "01" ...
## ..$ CODI_ENT : chr [1:1000] "0011" "0011" "0011" "0011" ...
## ..$ NIVEL_GOBIERNO: chr [1:1000] "GOBIERNO NACIONAL" "GOBIERNO NACIONAL" "GOBIERNO NACIONAL" "GOBIERNO NACIONAL" ...
## ..$ CONC_BAL : chr [1:1000] "100" "110" "120" "140" ...
## ..$ ANO_EJE : chr [1:1000] "2019" "2019" "2019" "2019" ...
## ..$ MES_EJE : chr [1:1000] "13" "13" "13" "13" ...
## ..$ DESC_BAL : chr [1:1000] "ACTIVO" "ACTIVO CORRIENTE" "Efectivo y Equivalente al Efectivo" "Cuentas por Cobrar (Neto)" ...
## ..$ vco1_bal : chr [1:1000] "- 0" "- 0" "249,855,081.36" "842,056.10" ...
## ..$ VCO1_AJUSTE : chr [1:1000] "- 0" "- 0" "- 0" "- 0" ...
## ..$ DESC_ENT : chr [1:1000] "MINISTERIO DE AGRICULTURA Y RIEGO" "MINISTERIO DE AGRICULTURA Y RIEGO" "MINISTERIO DE AGRICULTURA Y RIEGO" "MINISTERIO DE AGRICULTURA Y RIEGO" ...
## ..$ VCO2_AJUSTE : chr [1:1000] "- 0" "- 0" "- 0" "- 0" ...
## ..$ ID : chr [1:1000] "1" "2" "3" "4" ...
## ..$ vco2_bal : chr [1:1000] "- 0" "- 0" "305,482,034.31" "491,640.69" ...
## ..$ CODI_DEP : chr [1:1000] "15" "15" "15" "15" ...
## ..$ timestamp : num [1:1000] NA NA NA NA NA NA NA NA NA NA ...
## ..$ length : int [1:1000] NA NA NA NA NA NA NA NA NA NA ...
## $ status : int 3
## $ description : chr "Estado de Situación Financiera: Gobiernos Locales, Gobiernos Regionales, Gobiernos Nacionales, Empresas del Est"| __truncated__
## $ parameters : list()
## $ tags : chr [1:2] "estado de situación financiera" "ef1"
## $ last_revision_id: int 277065
## $ timestamp : NULL
## $ created_at : chr "2020-08-19T01:23:56Z"
## $ title : chr "DETALLE DEL AÑO 2019 - Estado de situación Financiera"
## $ modified_at : chr "2020-09-02T20:51:13Z"
## $ category_id : int 41358
## $ methods : NULL
## $ sources :'data.frame': 1 obs. of 3 variables:
## ..$ source__id : int 1781
## ..$ source__name: chr "Ministerio de Economía y Finanzas"
## ..$ source__url : chr "http://www.mef.gob.pe/"
## $ total_revisions : int 1
## $ frequency : chr "yearly"
## $ link : NULL
## $ user : chr "DGCP_editor"
## $ status_str : NULL
## $ guid : chr "ESTAD-DE-SITUA-FINAN-52884"
## $ category_name : chr "Estados Financieros"
Para acceder a los datos en formato tabla de esa solicitud debemos acceder al elemento result:
dataMEF=data.frame(MEFSI$result)
View(dataMEF)
Video sobre qué es el scrapping: “What is Web Scraping and What is it Used For?” https://www.youtube.com/watch?v=Ct8Gxo8StBU
En la vida real, no siempre nos darán las bases de datos listas para trabajar con ella,en muchos casos debemos descargarlas de repositorios u páginas web y debemos limpiar y ordenar nuestra bbdd.
Librerias necesarias (si no las tiene, instale)
library(htmltab)
library(stringr)
Las tablas de datos en la web pueden ser descargadas con facilidad, si se consigue identificar la ruta hacia ella. Cuando identifiques una tabla que te interesa, usa el botón derecho de tu mouse para inspeccionar el código de la página web. Usa la opción inspección hasta que resalte toda la tabla.
Vamos a extraer la tabla de los resultados del “Democracy Index” por pais, de la siguiente dirección: https://en.wikipedia.org/wiki/Democracy_Index
Estando en esa página usando GoogleChrome ubícate en la tabla e inspecciona usando el boton derecho:
Debes inspeccionar hasta que se resalte tu tabla:
Nota que en este caso tienes varias tablas, debes ser muy preciso en tu selección. Una vez haya identificado bien tu tabla, usa nuevamente el boton derecho sobre el código en html y copia el full XPATH. Nota que a veces es más util copiar el XPATH del cuerpo de la tabla (body), en vez que la tabla.
En firefox el procedimiento es el mismo.
Para extraer nuestra bbdd, utilizamos la función “htmltab”:
link = "https://en.wikipedia.org/wiki/Democracy_Index"
path = "/html/body/div[3]/div[3]/div[5]/div[1]/table[5]"
data2 = htmltab(link, path)
Otro ejemplo:
linkCIA_pbi = "https://www.cia.gov/the-world-factbook/field/real-gdp-per-capita/country-comparison"
linkPath_pbi='/html/body/div[1]/div[1]/div[2]/main/section[2]/div/div/div[2]/div/div/div/div/div/table'
pbi = htmltab(linkCIA_pbi, which =linkPath_pbi)
## No encoding supplied: defaulting to UTF-8.
Vamos a ver otra forma de “scrapear”, utilizando rvest.
library(rvest)
url="http://teacherlink.ed.usu.edu/tlresources/reference/factbook/fields/2212.html?countryName=&countryCode=®ionCode=%C3%82"
pagina_web=read_html(url)
#Clase CSS de country
css_country="td.fl_region"
country_html <- html_nodes(pagina_web,css_country)
country_texto <- html_text(country_html)
head(country_texto)
## [1] "Afghanistan\n \n \n "
## [2] "Albania\n \n \n "
## [3] "Algeria\n \n \n "
## [4] "American Samoa\n \n \n "
## [5] "Andorra\n \n \n "
## [6] "Angola\n \n \n "
#Clase CSS de urbanization
css_urbanization="td.category_data"
urbanization_html <- html_nodes(pagina_web,css_urbanization)
urbanization_texto <- html_text(urbanization_html)
head(urbanization_texto)
## [1] "\n \n urban population: 24% of total population (2008) \n rate of urbanization: 5.4% annual rate of change (2005-10 est.) \n "
## [2] "\n \n urban population: 47% of total population (2008) \n rate of urbanization: 1.9% annual rate of change (2005-10 est.) \n "
## [3] "\n \n urban population: 65% of total population (2008) \n rate of urbanization: 2.5% annual rate of change (2005-10 est.) \n "
## [4] "\n \n urban population: 92% of total population (2008) \n rate of urbanization: 2.4% annual rate of change (2005-10 est.) \n "
## [5] "\n \n urban population: 89% of total population (2008) \n rate of urbanization: -0.2% annual rate of change (2005-10 est.) \n "
## [6] "\n \n urban population: 57% of total population (2008) \n rate of urbanization: 4.4% annual rate of change (2005-10 est.) \n "
#Armamos la bbdd
urban <- data.frame(COUNTRY = country_texto, URBANIZATION = urbanization_texto)
View(urban)
¿Cómo exportamos la base de datos que hemos obtenido?
En muchos casos nos va ser útil exportar a CSV,lo podemos hacer con la función write_csv del paquete readr. Vamos a exportar el data frame producto del scrapeo:
library(readr)
##
## Attaching package: 'readr'
## The following object is masked from 'package:rvest':
##
## guess_encoding
write_csv(urban, file = "urban.csv")
También podemos exportar en formato R:
save(urban,file="urban.Rda")
EJERCICIO.