Web Scraping con Python aplicado al sitio Web del INEGI

Aaron Lara O
MCD-UNISON
5 min readSep 18, 2021

--

En esta publicación se aborda, de una manera práctica, el tema del Web Scraping aplicado al sitio Web del INEGI, en particular a la Red Nacional de Metadatos; se mencionan las herramientas a utilizar para desarrollarlo, y se analiza el código utilizado para obtener información de una pagina Web en específico.

El objetivo de este proyecto es extraer información actualizada del sitio Web de una forma automatizada, de ninguna manera se tiene la intensión de perturbar el funcionamiento de los servidores de la institución.

Antecedentes:

El Instituto Nacional de Estadística Geografía e Informática (INEGI) es una de las instituciones mexicanas referentes cuando se trata de buscar datos e información confiable, en una diversidad de ámbitos y de periodicidad.

La Red Nacional de Metadatos (RNM) es una iniciativa del INEGI para crear una plataforma de difusión y consulta de metadatos de los proyecto de información estadística.

Desarrollo:

El Web Scraping es una técnica para extraer información de sitios Web donde no es posible utilizar una Interfaz de Programación de Aplicaciones (API). Existen en el mercado diversas diversas técnicas y herramientas, tanto comerciales como de software libre. En este proyecto se utiliza Python y librerías como “beautifulsoup” y “requests”.

Para empezar a realizar el Web Scraping es gran utilidad conocer la estructura de la página Web, por lo que se utilizan las herramientas de desarrolladores para explorar el código en busca de etiquetas o patrones que puedan servir para acotar la búsqueda; en el caso del navegador Firefox se accede a ellas con la combinación de teclas Ctrl + Mayus + I.

Uso de herramientas de desarrolladores

Se inicia el código importando las librerías como “pandas” para el manejo de archivos, “requests” para realizar las peticiones a los sitios Web, “beautifulsoup” para extraer la información de los sitios, por mencionar algunos. Además de la librería “requests_cache”, la cual crea una base de datos tipo “sqlite” para guardar en caché las peticiones al servidor, lo que es particularmente útil en las fases de pruebas del código, o cuando el Firewall es muy restrictivo con los robots.

librerías a utilizar

La RNM cuenta con un catálogo de proyectos en formato CSV, que en este caso en particular se emplea para explorar la información de interés, como pueden ser temas, proyectos o fechas.

Con el uso de librería “pandas” y la instrucción “read_csv” se lee el archivo catálogo y se imprime la cabecera para ver parte de este.

leer el catálogo en CSV
cabecera del catálogo de proyectos

El interés de este proyecto es obtener la última información publicada, por lo que se utiliza la columna “changed” para obtener los archivos modificados recientemente.

En ocasiones, resulta complicado manipular fechas cuando no son del formato “datetime”, por lo que una buena práctica es transformar las columnas con fechas con la instrucción “to_datetime”, posteriormente se define la columna “id” como indice.

comandos datetime y set index
salida del comando set_index

Se aplica un filtro al catálogo para seleccionar las publicaciones de la última semana, basándose en la columna “changed”.

resultados del filtro por fecha

A continuación se crea un ciclo para iterar sobre cada uno de los “id” del filtro “sep2021” y extraer los archivos de estas páginas. Las ligas de la RNM donde se encuentran los archivos de los proyectos y encuestas, se componen de un URL base más el “id” del catálogo más la sección “related-materials”.

La librería “requests” permite realizar la petición al servidor Web, este responde con un código, cada uno tiene su significado, en general se pueden englobar en las siguientes categorías: los códigos 100 se trata de respuestas informativas, los códigos 200 son respuesta afirmativa, 300 son redirecciones, 400 significa errores en el cliente y 500 errores en el servidor.

Posteriormente, se extrae la información del sitio Web con la librería “BeautifulSoup”. Esta librería posibilita explorar las paginas Web en busca de etiquetas, para ello se utiliza el comando “find_all” para buscar las etiquetas del tipo “a” de una clase en particular; para encontrar la clase que alberga los sitios de descarga fue necesario explorar la pagina Web con las herramientas de desarrollador antes mencionadas.

primer ciclo

Con lo anterior, se extrae los URL donde se encuentra la información que se desea obtener, lo siguiente es generar un ciclo nuevo dentro del ciclo anterior, el código del nuevo ciclo es básicamente el mismo que el ciclo anterior con algunas modificaciones que permiten descargar los archivos del sitio.

segundo ciclo
resultados de los ciclos de descarga

Los archivos JSON y XML contienen información valiosa acerca de las publicaciones, por lo que es conveniente conservarlos juntos con los archivos descargados. El código para descargarlos similar al del ciclo anterior, con la diferencia de una condición para buscar en especifico cierto tipo de archivo.

Con estas lineas de código se puede descargar archivos de varias paginas Web a partir de una URL base. El código completo se consultar y descargar del sitio de GitHub.

Conclusiones:

El Web Scraping es una herramienta útil para extraer información de los sitios Web, sin embargo, no sustituye al uso de una API. Un sitio tan diverso y complejo como el del INEGI hace evidente las deficiencias del Web Scraping y, a su vez, la necesidad de una API que ayude a realizar consultas, descargas y el compartir información de manera eficiente, programable y estandarizada.

Referencias:

Instituto Nacional de Estadística Geografía e Informática(s.f). Red Nacional de Metadatos. https://www.inegi.org.mx/rnm/index.php/catalog

Wulf, P. (25 de marzo de 2021). Web Scraping with Beautiful Soup. https://www.scrapingbee.com/blog/python-web-scraping-beautiful-soup/

Ujhelyi, T. (29 de marzo de 2021). Beautiful Soup Tutorial 1. https://data36.com/beautiful-soup-tutorial-web-scraping/

Downloading PDFs with Python using Requests and Beautiful Soup. (13 de abril de 2021). https://www.geeksforgeeks.org/downloading-pdfs-with-python-using-requests-and-beautifulsoup/?ref=rp

--

--