Obtener datos oficiales de fertilizantes con Python

Obtener datos oficiales de fertilizantes con Python es un proceso basado en scrapear la web que contiene estos datos. En este caso, estos datos no pueden ser accedidos por medio de una api rest o descargarlos en su conjunto.

La fuente de estos datos es el Ministerio de agricultura, pesca y alimentación del gobierno de España. En esta web se pueden consultar los datos en forma de búsqueda siguiendo ciertos parámetros especificados en un formulario. El objetivo será descargar el conjunto completo de los datos oficiales de productos fertilizantes admitidos mediante varios scripts en Python.

Librerías utilizadas

Obtener el listado de fertilizantes autorizados con Python

Para obtener el listado de fertilizantes autorizados con Python se han iterado las distintas páginas que tiene la web y de cada una se obtenido la información.

base_url = 'https://www.mapa.gob.es/app/consultafertilizante/ListadoFertilizantes.aspx?Page='
products = []
n_pages = 70

for i in range(0,n_pages + 1):
    partial_products = get_products(base_url+str(i))
    for p in partial_products:
        products.append(p)

El bloque de código en cuestión llama a una función para cada url generada. Con esta función se scrapea el listado de fertilizantes que componen la url pasada como parámetro.

def get_products(url):
    page = requests.get(url)
    page.encoding='utf-8'
    pagetext = page.text
    tree = BeautifulSoup(pagetext)

    table_tag = tree.select("table")[1]
    links = get_links(table_tag)
    tab_data = [[item.text for item in row_data.select("th,td")]
                for row_data in table_tag.select("tr")]

    data = tab_data[2::]

    for i in range(0,len(data)):
        data[i].append(links[i])

    return data

Cada url suministrada a la función anterior está formada por una página web que contiene una tabla como la siguiente:

El objetivo de la función es obtener cada una de estas columnas junto el enlace a la documentación de cada fertilizante. Para esto último se hace uso de otra función que se ejecuta una única vez y obtiene el enlace de la documentación para cada fila de la tabla scrapeada.

def get_links(table_tag):
    links = []

    for row_data in table_tag.select("tr"):
        link_tag = row_data.find('a', href=True)

        if(link_tag == None):
            continue

        links.append('https://www.mapa.gob.es/app/consultafertilizante/' + link_tag.get('href'))  

    return links
CódigoTipoNombre comercialFabricanteF. de registroUrl
F0000063/2021Abono órgano-mineral NPKBOY 12JOSE FUSTE, S.A.27/04/2011https://www.mapa.gob.es/app/consultafertilizante/DetalleFertilizante.aspx?clave=63
Ejemplo de un fertilizante

Obtener la composición de los fertilizantes autorizados con Python

Una vez realizado un scraping básico para obtener todos los fertilizantes autorizados, se pueden obtener multitud de datos adicionales según cuál sea el objetivo. En este caso, vamos a obtener la composición básica de cada fertilizante.

El proceso se basa en aplicar la siguiente función a cada fertilizante obtenido anteriormente pasándole su respectiva url:

def get_composition(url):
    global components
    global equivalencies
    page = requests.get(url)
    page.encoding='utf-8'
    pagetext = page.text

    tree = BeautifulSoup(pagetext)
    if(len(tree.select("table"))>2):
        table_tag = tree.select("table")[3]
        tab_data = [[item.text for item in row_data.select("th,td")]
                        for row_data in table_tag.select("tr")]

        composition = ''
        for e in tab_data:
            if(e[0] in components and e[1] != '-'):
                if e[0] in equivalencies.keys():
                    composition += e[1] +'% ' + equivalencies[e[0]] + '; '
                else: 
                    composition += e[1] +'% ' + e[0] + '; '

        return composition[0:-2]
    else:
        return None

Los componentes y las equivalencias son definidos de forma estática para obtener el resultado deseado.

CódigoTipoNombre comercialFabricanteF. de registroUrlComposition
F0000063/2021Abono órgano-mineral NPKBOY 12JOSE FUSTE, S.A.27/04/2011https://www.mapa.gob.es/app/consultafertilizante/DetalleFertilizante.aspx?clave=636,0% Nitrógeno (N); 10,0% Fósforo (P); 6,0% Potasio (K)
Ejemplo de un fertilizante con composición

Código y datos

El código se ha desarrollado de dos formas, con un notebook y con dos scripts, uno para obtener los fertilizantes únicamente y otro para obtenerlos con la composición. Ambos scripts tienen cómo salida un fichero en csv con sus respectivos datos.

Notebook

Posible proyecto futuro

Teniendo en cuenta que no se puede acceder a estos datos mediante una API es complicado crear sistemas que requieran estos datos actualizados. Por ello, una solución podría ser crear una API REST con Python que mediante un cron diario o semanal realice este proceso de scraping y almacene de forma actualizada los mismos. Para que posteriormente estos se puedan servir a otros sistemas de forma sencilla y actualizada.

Deja un comentario